我在类中有以下属性:
protected Int32 MyProperty { get; set; }
在派生类中我想用:
覆盖它protected Long MyProperty {get ;set; }
是使用new
关键字执行此操作的唯一方法,以便可以隐藏基类属性吗?
答案 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)