使用子类重写属性
本文关键字:属性 重写 子类 | 更新日期: 2023-09-27 18:34:48
假设我在抽象类AbstractClass中有这样的属性:
protected MyClass MyProperty { get; set; }
此属性用于 AbstractClass 中的许多(虚拟(方法。在 AbstractClass 的子类中,我希望 MyProperty 成为 MyClass 的子类,这可能还是我必须强制转换它?
MyProperty = new SubclassOfMyClass();
((SubclassOfMyClass)MyProperty).Method();
看起来不太好看...我尝试使用"new"关键字来隐藏MyProperty,如下所示:
protected new SubclassOfMyClass MyProperty { get; set; }
但这并没有像我想象的那样成功,因为它似乎创建了第二个 MyProperty,并导致 AbstractClass 中的那个总是为空。
所以我想出了一些看起来有点黑客的东西:
protected new SubclassOfMyClass MyProperty
{
get { return base.MyProperty as SubclassOfMyClass; }
set { base.MyProperty = value; }
}
有没有更好的方法可以做到这一点?
您可以使用泛型:
public abstract class AbstractClass<T> where T : MyClass, new() {
protected T MyProperty { get; set; }
}
public class SubClass : AbstractClass<SubclassOfMyClass> {
}
编辑:
这是对您的"黑客"的回应:
请考虑以下代码:
public class MyClass { }
public class SubclassOfMyClass : MyClass { }
public abstract class AbstractClass
{
public MyClass MyProperty { get; set; }
}
public class Subclass : AbstractClass
{
public new SubclassOfMyClass MyProperty
{
get { return base.MyProperty as SubclassOfMyClass; }
set { base.MyProperty = value; }
}
}
public class Test
{
public static void Main()
{
AbstractClass sub = new Subclass();
sub.MyProperty = new MyClass();
Subclass sub2 = (Subclass)sub;//casting succeeds since sub is Subclass
if (sub2.MyProperty == null)
Console.WriteLine("sub2.MyProperty is null!");
}
}
这实际上打印了"sub2.我的财产是空的!将sub
强制转换为sub2
然后访问sub2.MyProperty
base.MyProperty
后,类型仍为 MyClass
,base.MyProperty as SubclassOfMyClass
按预期返回 null。因此,如果您要使用new
关键字,您应该真正了解幕后发生的事情。