使用子类重写属性

本文关键字:属性 重写 子类 | 更新日期: 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后,类型MyClassbase.MyProperty as SubclassOfMyClass按预期返回 null。因此,如果您要使用new关键字,您应该真正了解幕后发生的事情。