0

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

有一个更好的方法吗?

4

1 回答 1

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 为空!”。在转换subsub2然后访问之后sub2.MyProperty base.MyProperty仍然类型MyClass并按base.MyProperty as SubclassOfMyClass预期返回 null 。因此,如果您要使用new关键字,您应该真正了解幕后发生的事情。

于 2013-10-11T08:39:20.120 回答