假设我在抽象类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; }
}
有更好的方法吗?
答案 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
仍为类型为MyClass
且base.MyProperty as SubclassOfMyClass
返回null正如所料。因此,如果您要使用new
关键字,您应该真正了解幕后发生的事情。