在基本抽象类中使用派生类型

Dan*_*ler 6 c# inheritance type-parameter

好吧,我有一些从基类派生的不同类.此基类是包含commom方法的抽象.

其中一个方法是一个Copy方法,它应该出现在所有派生类中,所以,我把它放在基类中.但是,我想让它返回derived type不是基础也不是对象.

我得到的解决方案是使用类型参数:

abstract class CopyableClass<T>
{
    public abstract T Copy();
}

class DerivedClass : CopyableClass<DerivedClass>
{
    public override DerivedClass Copy()
    {
        //do what is needed for copy and return a new DerivedClass
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,这里的主要目的是

删除基类中的type参数,仍然使该方法返回相应的派生类型.


一个解决方法.

到目前为止我能做的最好的事情是以下评论之一,但它仍然使用通用参数

abstract class BaseClass
{
    //base methods not related to deriving type
}

interface ICopyable<T>
{
     T Copy();
}

class DerivedClass : BaseClass, ICopyable<DerivedClass>
{
    public DerivedClass Copy()
    {
        //do what is needed for copy and return a new DerivedClass
    }
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ger 5

你不能真的.基类不可能知道所有未来的实现.您将不得不求助于通用抽象类(就像您所做的那样)类型或泛型Copy方法.

public abstract class CopyableClass
{
    public abstract T Copy<T>() where T : CopyableClass;
}

public class DerivedClass : CopyableClass
{
    public override T Copy<T>()
    {
        if(typeof(T) != typeof(DerivedClass))
            throw new ArgumentException();

        // return your copy
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要在基类中概括类型检查:

public abstract class CopyableClass
{
    public T Copy<T>() where T : CopyableClass
    {
        if(GetType() != typeof(T))
            throw new ArgumentException();

        return (T) Copy();
    }

    protected abstract CopyableClass Copy();
}

public class DerivedClass : CopyableClass
{
    protected override CopyableClass Copy()
    {
        return // Your copy;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,第二种方法将大量信任放入派生类的实现中,因为它将盲目地转换抽象方法的返回值.编译器将允许您在派生类型中返回另一个类型,实现CopyableClass,但它将是运行时错误.如果您对所有派生实现具有绝对控制权(即您的抽象类也具有内部构造函数),则这不是问题.