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)
你不能真的.基类不可能知道所有未来的实现.您将不得不求助于通用抽象类(就像您所做的那样)类型或泛型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,但它将是运行时错误.如果您对所有派生实现具有绝对控制权(即您的抽象类也具有内部构造函数),则这不是问题.
| 归档时间: |
|
| 查看次数: |
7247 次 |
| 最近记录: |