[英]Inherit from a base class and provide the inheritance type to overridden method
我有一個基類,其方法可以被覆蓋。 如果我從這個基類繼承一個類,我怎么能讓該方法返回繼承的類型?
喜歡:
public class ClassA : BaseClass
{
public override ClassA TestMethod(...)
{
// ...
}
}
我是否需要手動為基類提供類型? 或者我可以自動提供該類型嗎?
您可以使用泛型類型來執行此操作。
public class BaseClass<T> where T : BaseClass<T> {
public abstract T TestMethod(...);
}
public class ClassA : BaseClass<ClassA>
{
public override ClassA TestMethod(...)
{
// ...
}
}
你為什么需要它? 可能導致更好的適合答案......
你想要的功能有一個名字; 這是返回類型的協方差 。
C#不支持的原因如下:
其他答案都表明您使用奇怪的重復模板模式的C#版本來解決您的問題。 我的觀點是,這種模式比它解決的問題更多。 有關詳細信息,請參閱我關於該主題的文章:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx
解決此問題的更好方法是使用此模式:
abstract class Animal
{
protected abstract Animal ProtectedGetMother();
public Animal GetMother()
{
return this.ProtectedGetMother();
}
}
class Cat : Animal
{
protected override Animal ProtectedGetMother()
{
do the work particular to cats here
make sure you return a Cat
}
public new Cat GetMother()
{
return (Cat)this.ProtectedGetMother();
}
}
問題是您無法使用不同的返回類型覆蓋虛擬方法。 所以不要。 使用不同的返回類型創建一個全新的方法, 並使虛方法成為類層次結構的實現細節 。
這種技術比這種Cat : Animal<Cat>
“貓是貓的動物”廢話大約容易理解十億倍。
您可以通用方式執行此操作:
public abstract class Base
{
public abstract T AbstractTestMethod<T>() where T : Base;
public virtual T VirtualTestMethod<T>() where T : Base, new()
{
return new T();
}
}
public class ClassA : Base
{
public override ClassA AbstractTestMethod<ClassA>()
{
return new ClassA();
}
public override ClassA VirtualTestMethod<ClassA>()
{
return new ClassA();
}
}
使用虛方法的行為不如使用抽象方法那么嚴格。 使用抽象方式可以強制開發人員自己實現該方法。 . 使用虛擬方式,您可以告訴他們 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.