例如,我有两个类执行相同的功能:
class HDD : Disk
{
public HDD RMA()
{
HDD newHDD = RMAService.Exchange(this);
return newHDD;
}
}
class SSD : Disk
{
public SSD RMA()
{
SSD newSSD = RMAService.Exchange(this);
return newSSD;
}
}
我想要的是在基类中实现 RMA 函数,但保持强类型返回值,以便用户可以通过函数签名确定他们正在返回他们发送的磁盘类型!
到目前为止我已经尝试过:
(参见下面的解决方案)
这个类型定义很丑陋。任何创建自己的 Disk 类或对 Disk 的引用的人都很难知道如何正确使用该类型。
也没有办法将类型参数限制为所定义的类。似乎很奇怪的是,没有一种专门的方法可以在基类中声明属性或方法,其中编译时类型就是派生类型。
最佳答案
发布这个答案是为了设置基线,但正如我所说,我不喜欢这种奇怪的“让一个类将其自身作为类型参数传递给其基类”构造。
abstract class Disk<T> where T : Disk<T> //Ugly recursive type parameter
{
public Disk()
{
if( this.GetType() != typeof(T) ) //Ugly type check
throw new Exception("The type argument must be precisely the " +
"derived class you're defining. Annoying eh?")
}
public T RMA()
{
Disk<T> newDisk = RMAService.Exchange(this)
return (T)newDisk; //Ugly explicit cast
}
}
这允许你去:
class HDD : Disk<HDD> { } //Ugly self-referencing type parameter
class SSD : Disk<SSD> { }
HDD newHDD = someHDD.RMA();
关于c# - 如何定义返回派生类类型实例的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20984361/