c# 如何 return a class 在工厂方法中指定泛型 class
c# How to return a class that specify a generic class in factory method
我想知道是否可以使用这种方法而不用在 return 上进行那种丑陋的转换?
public static AbstractFileReader<T> GetReader<T>(string filename, T data)
{
if(data is string)
{
return GetTextFileReader(filename) as AbstractFileReader<T>;
}
else if(data is byte[])
{
return GetBytesFileReader(filename) as AbstractFileReader<T>;
}
else
{
Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
return null;
}
}
为简单起见,这是我的架构:
> AbstractFileReader<T> => The generic base class
> AbstractTextFileReader : AbstractFileReader<string> => an abstract class
> StandaloneTextFileReader : AbstractTextFileReader => the final implementation
我的第一个想法是做一个像这样的方法:
public static AbstractFileReader<T> GetReader<T>(string filename, T data)
{
if(data is string)
{
return StandaloneTextFileReader(filename);
}
else if(data is byte[])
{
return StandaloneBytesFileReader(filename);
}
else
{
Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
return null;
}
}
但我的编译器似乎不接受它。有什么办法可以实现吗?
谢谢
泛型在这里没有给你任何好处。
您目前使用 T
的全部目的是指定其中一个参数的类型(除了查询其类型外,您甚至不使用它)。您可以像 AbstractFileReader GetReader(string filename, Object data)
.
一样轻松地编写它
泛型的全部意义在于不关心类型是什么(尽管您可以对其施加限制)以及泛型class公开的所有方法无论类型 T
是什么(例如,List
s),操作方式都相同。
这里不是这种情况。
因此,您根本不应该在这里使用泛型。只需在某处使用 GetReaderForString
和 GetReaderForBytes
方法,并根据需要 return 使用 StandaloneTextFileReader
或 StandaloneBytesFileReader
(或者完全放弃这些方法,只使用 new
合适的 class).
我想知道是否可以使用这种方法而不用在 return 上进行那种丑陋的转换?
public static AbstractFileReader<T> GetReader<T>(string filename, T data)
{
if(data is string)
{
return GetTextFileReader(filename) as AbstractFileReader<T>;
}
else if(data is byte[])
{
return GetBytesFileReader(filename) as AbstractFileReader<T>;
}
else
{
Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
return null;
}
}
为简单起见,这是我的架构:
> AbstractFileReader<T> => The generic base class
> AbstractTextFileReader : AbstractFileReader<string> => an abstract class
> StandaloneTextFileReader : AbstractTextFileReader => the final implementation
我的第一个想法是做一个像这样的方法:
public static AbstractFileReader<T> GetReader<T>(string filename, T data)
{
if(data is string)
{
return StandaloneTextFileReader(filename);
}
else if(data is byte[])
{
return StandaloneBytesFileReader(filename);
}
else
{
Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
return null;
}
}
但我的编译器似乎不接受它。有什么办法可以实现吗? 谢谢
泛型在这里没有给你任何好处。
您目前使用 T
的全部目的是指定其中一个参数的类型(除了查询其类型外,您甚至不使用它)。您可以像 AbstractFileReader GetReader(string filename, Object data)
.
泛型的全部意义在于不关心类型是什么(尽管您可以对其施加限制)以及泛型class公开的所有方法无论类型 T
是什么(例如,List
s),操作方式都相同。
这里不是这种情况。
因此,您根本不应该在这里使用泛型。只需在某处使用 GetReaderForString
和 GetReaderForBytes
方法,并根据需要 return 使用 StandaloneTextFileReader
或 StandaloneBytesFileReader
(或者完全放弃这些方法,只使用 new
合适的 class).