簡體   English   中英

使用具體類型覆蓋通用方法(類型參數*隱藏類*)

[英]Override Generic Method With Concrete Type (type parameter * hides class *)

我想在派生類中重寫泛型方法。 我要抓住的是這樣一個具體的類型參數實現:

namespace Stumped
{
    public class Generic<T> where T : new()
    {
        public virtual T Foo()
        {
            return new T();
        }

        public virtual TAnother GenericMethod<TAnother>() where TAnother : new()
        {
            return new TAnother();
        }
    }

    public class Concrete : Generic<Inner1>
    {
        // Concrete return type. Works as expected.
        public override Inner1 Foo()
        {
            return base.Foo();
        }

        // Why doesn't this make sense? Shows 'Type parameter "Inner2" hides class "Inner2"'.
        public override Inner2 GenericMethod<Inner2>()
        {
            return base.GenericMethod<Inner2>();
        }
    }

    public class Inner1 { }

    public class Inner2 { }
}

如前所述,編譯器告訴我:

類型參數“內部”隱藏類“內部”

我希望我的實現能夠正常工作,而不必在此派生類中使用另一個通用參數。

為什么這沒有道理?

你根本做不到。

覆蓋方法不能更改方法界面的任何部分。 由於GenericMethod<OtherClass>()對基類有效,因此它對派生類也必須有效。

這稱為Liskov替代原理

當編譯器警告您時,您實際上只是聲明了一個普通類型參數,該參數恰好與您的類具有相同的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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