如何在C#中隐藏基类属性?

时间:2011-02-02 13:36:34

标签: c# inheritance

我在类中有以下属性:

protected Int32 MyProperty { get; set; }

在派生类中我想用:

覆盖它
protected Long MyProperty {get ;set; }

是使用new关键字执行此操作的唯一方法,以便可以隐藏基类属性吗?

4 个答案:

答案 0 :(得分:3)

覆盖必须与它们覆盖的签名相同,因此您无法更改字段的类型。

答案 1 :(得分:3)

尝试以这种方式覆盖的另一个选择是使您的类具有通用性;

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

public class MyIntClass : MyClass<int>
{}

public class MyLongClass : MyClass<long>
{}

答案 2 :(得分:2)

您没有覆盖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.
}

答案 3 :(得分:0)

您可以使用属性的overridenew修饰符覆盖它。但是,这两个属性需要是相同的类型。不同之处在于,如果您在override类上调用该属性,实际上是Base类,并且仅在您调用Derived时使用new,则也会调用derived Base b = new Derived(); b.SomeMethod(); 课程。SomeMethod。请参阅Jon Skeet撰写的this有趣文章,解释其中的差异。正如Jon在那里所说,如果你写的话

override
使用new关键字覆盖了

SomeMethod,将调用派生类的方法。如果您使用{{1}}关键字,则会调用基类中的方法{{1}}。