簡體   English   中英

如何在C#中隱藏基類屬性?

[英]How do I hide a base class property in C#?

我在一個類中具有以下屬性:

protected Int32 MyProperty { get; set; }

在派生類中,我想用:

protected Long MyProperty {get ;set; }

使用new關鍵字執行此操作的唯一方法是可以隱藏基類屬性嗎?

覆蓋必須與覆蓋的簽名相同,因此您不能更改字段的類型。

除了嘗試以這種方式覆蓋之外,另一種選擇是使您的類通用。

public abstract class MyClass<T>
{
   public T MyValue{ get; set;}
}

public class MyIntClass : MyClass<int>
{}

public class MyLongClass : MyClass<long>
{}

您並沒有覆蓋MyInt字段,而是創建了一個新字段,必須通過該字段指定new

protected new Long MyInt = 0;

如果您的代碼將訪問該類作為基類的實例,則它將以Int32訪問;如果您直接調用子類,則它將以Long訪問:

public class MyClass
{
    protected int MyValue = 0;
}

public class MySubclass : MyClass
{
    protected new long MyValue = 0;
}

void Test()
{
    MyClass instance = new MyClass();
    instance.MyValue = 10; // int

    MySubclass instance2 = new MySubclass();
    instance2.MyValue = 10; // long

    MyClass instance3 = (MyClass)instance2;
    int value = instance3.MyValue; // int - value is 0.
}

您可以為屬性使用overridenew修飾符來覆蓋它。 不過,這兩個屬性必須是相同的類型。 區別在於,如果您在Base類上調用該屬性,則該override實際上也會被調用,而Base類實際上是Derived類,而new僅在您在derived類上調用它時才使用。 請參閱喬恩·斯凱特(Jon Skeet)的這篇有趣的文章,其中介紹了差異。 如喬恩所說,如果你寫

Base b = new Derived();
b.SomeMethod();

並且使用override關鍵字覆蓋了SomeMethod ,將調用派生類的方法。 如果使用new關鍵字,則將調用基類中的SomeMethod方法。

暫無
暫無

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

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