用子类覆盖属性

时间:2013-10-11 08:33:59

标签: c# properties override subclass

假设我在抽象类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; }
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用泛型:

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.MyProperty为null!”。将sub转换为sub2然后访问sub2.MyProperty base.MyProperty 仍为类型为MyClassbase.MyProperty as SubclassOfMyClass返回null正如所料。因此,如果您要使用new关键字,您应该真正了解幕后发生的事情。