[英]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.