簡體   English   中英

從基類繼承並為重寫方法提供繼承類型

[英]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#在實現接口時不允許繼承返回類型

其他答案都表明您使用奇怪的重復模板模式的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM