c# - 如何定义返回派生类类型实例的泛型方法?

标签 c# generics

例如,我有两个类执行相同的功能:

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/

相关文章:

c# - 从 xml 文件调用方法

java - 将通用列表转换为数组

java - 一个方法中的多个泛型

c# - 计算闪存驱动器内容的校验和

c# - 如何从执行程序集引用库?

c# - 检查可为 null 的惰性值

c# - 正在更新 LINQ to SQL,但我的查询来自联接?无法使用使用联接的查询进行更新?

java - Spring 通用 REST Controller : parsing request body

java - 如何将值输入到通用定义的数组列表中?

java - 如果没有中间变量,泛型代码无法编译