簡體   English   中英

將派生類轉換為基類

[英]Convert derived class to base class

我試圖刷新我的記憶,但無法通過 Google 找到答案。

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public override void DoSomething()
    {
        Trace.Write("derived class");
    }
}

如果我創建派生類的實例,如何將其轉換為它的基類,以便在調用 DoSomething() 時,它僅使用基類的方法?

動態轉換仍然調用派生類的重寫方法:

DerivedClass dc = new DerivedClass();

dc.DoSomething();

(dc as BaseClass).DoSomething();

輸出:“派生類”

雖然這聽起來不合理但確實有效

 DerivedClass B = new DerivedClass();

BaseClass bc = JsonConvert.DeserializeObject<BaseClass>(JsonConvert.SerializeObject(B));

你不能 - 這完全是故意的,因為這就是多態性的全部內容。 假設您有一個派生類,它對傳遞給重寫方法的參數強制執行某些先決條件,以保持完整性……您不希望能夠繞過該驗證並破壞其內部完整性。

在類本身內,您可以非虛擬地調用base.AnyMethod() (無論是否是您要覆蓋的方法),但這沒關系,因為這是類本身決定可能允許其完整性受到侵犯的類 - 大概它知道它是什么正在做。

您絕對可以(調用基本方法),只需閱讀多態:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/polymorphism

例子:

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

以及如何稱呼它:

DerivedClass B = new DerivedClass();
B.DoWork();  // This calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // This calls the old method.

嘗試使用new關鍵字而不是override據我所知,這應該會啟用所需的行為。 我不太確定,所以如果我錯了,請不要怪我!

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public new void DoSomething()
    {
        Trace.Write("derived class");
    }
}

使用new而不是override的解決方案打破了多態性。 最近我遇到了同樣的問題並通過以下方式實現了它。 我的解決方案有以下優點:

  • virtualoverride保持原位;
  • BaseClass未在鑄型直接使用,因此,如果我介紹的中間MiddleClass在之間的層次結構BaseClassDerivedClass ,這也實現了DoSomething() ; 那么MiddleClass的實現將不會被跳過。

這是實現:

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public override void DoSomething()
    {
        Trace.Write("derived class");
    }

    public void BaseDoSomething()
    {
        base.DoSomething();
    }
}

用法是:

    DerivedClass dc = new DerivedClass();

    dc.DoSomething();

    dc.BaseDoSomething();

對於 VB.net,我使用以下代碼進行轉換(顯示為對象列表):

        Dim tempPartialList As New List(Of clsBaseData)

        For Each iterClsDerivedData As clsDerivedData In ListOfDerivedDataObjects
            tempPartialList.Add(CType(iterClsDerivedData, clsBaseData))
        Next

其中 clsBaseData 是通過繼承 clsBaseData 生成 clsDerivedData 的基類。

ListOfDerivedDataObjects 是一個 List(Of clsDerivedData)。

我發現這在我有多個派生類列表的情況下很有用,並且我想對派生類列表中的所有對象的基類的屬性進行操作。 tempPartialList 對我來說是一個臨時列表,旨在方便更改此屬性。

暫無
暫無

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

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