因此,基本上我想做的就是能够创建一个属性名称空间,该属性名称空间可以被该属性的父项的子项覆盖。这里的实际应用是维护模型/视图系统。如果视图是从相同的基本视图类派生的,则某些视图需要使用更复杂的模型来执行其功能。
我想知道是否存在最佳实践模式,因为我目前仅隐藏变量名称空间的方法看起来太乱了。这是我的意思的一些示例伪代码:
public class ParentPropertyType{
public string bar = "bar";
}
public class ChildPropertyType: ParentPropertyType{
public string foo = "foo";
}
public class ChildManager:ParentManager {
public virtual ChildPropertyType PropertyType {get; set;}
}
public class ParentManager{
public override ParentPropertyType PropertyType {get; set;}
}
...
Debug.Log(new ParentManager().PropertyType.foo);
答案 0 :(得分:2)
似乎您应该使您的ParentManager
类通用:
public class ChildManager : ParentManager<ChildPropertyType>
{
}
public class ParentManager<T> where T: ParentPropertyType
{
public T PropertyType { get; set; }
}
现在,您甚至不需要virtual
和override
,因为根据所使用的类,该属性具有正确的类型。因此,以下编译很好,因为PropertyType返回了一个实例。 ChildPropertyType:
var manager = new ChildManager();
ChildPropertyType c = manager.PropertyType;
答案 1 :(得分:0)
在C#中,无法重写方法并将其返回类型更改为后代类型。 “悲伤但真实”。
如果我是你,我将重新引入(使用“ new”)方法/属性以返回所需的类型。