簡體   English   中英

返回父類中的子類型

[英]Returning child type in Parent class

      public abstract class Base
      {
         public Base ClassReturn()
        {
            return this;
        }
      }

是否有可能返回調用ClassReturn方法的子類型? 我已經在擴展方法中做到了:

public static T ClassReturn<T>(this T obj) where T : Base
        {
            return (T) obj.ClassReturn();
        }

但我想將其嵌入到基類中,而不是擴展方法中。 有可能使用泛型嗎?

我將復制我的評論,描述我想要實現的目標:

我需要一些類似於生成器模式的東西,並且我有不同的類,這些類根據以前的操作執行其他操作,現在我想在每個類中都具有類似的功能,並且當我使用它時,我會丟失對象類型。 因此,我的解決方案是在每個類中多次實現該功能,或者創建擴展方法。 但是我一直認為,只要有可能為類創建擴展方法,就可以將其嵌入到類中,但是我認為這是不可能的。

完整示例:

 public class Child1 : Base
        {
            public Child1 Operation1()
            {
                Console.WriteLine("operation1");
                return this;
            }
        }

        public class Child2 : Base
        {
            public Child2 Operation2()
            {
                Console.WriteLine("operation2");
                return this;
            }
        }



        static void Main(string[] args)
        {
            Child1 ch = new Child1();
            ch.Operation1().Operation1().ClassReturn().Operation1()
        }

如果不使用擴展方法,則無法在ClassReturn之后使用Operation1。

試試這個:

public abstract class Base<T> where T: Base<T>
{
    public T ClassReturn
    {
        get { return (T)this; }
    }
}

public class Child1 : Base<Child1>
{
}

public class Child2 : Base<Child2>
{
}

從您的問題和評論中,您無法嘗試直接從類型系統中實現什么。 通過返回Base的實例,您特別要說的是,您感興趣的只是您有一些從Base派生的東西,但是特定的類無關緊要。 靜態地,編譯器不再具有執行強制轉換所需的信息。

如果您試圖靜態地恢復原始類型,則必須將信息提供給編譯器,在這種情況下,您不能保證您擁有正確的信息。 在下面的示例中,實例是從派生類型A創建的,但是嘗試通過擴展將其強制轉換為派生類型B ,編譯器將允許代碼進行編譯,但是您將在運行時遇到異常。

public class A : Base { }
public class B : Base { }

public static class BaseExtensions
{
    public static T GetAsT<T>(this Base base)  where T: Base
    {
       return (T)base;
    }
}


public static void Main() 
{
    Base obj = new A();
    B b = obj.BaseAsT<B>(); // This compiles but causes an exception
}

您應該查閱《 Liscov替代原理》,以獲取有關如何在整個系統中正確使用基類和派生類的信息,然后編寫一個專門解決您要達到的結果的問題。

暫無
暫無

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

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