C#覆盖具有子/父关系的属性

时间:2018-11-05 11:13:56

标签: c# unity3d design-patterns properties

因此,基本上我想做的就是能够创建一个属性名称空间,该属性名称空间可以被该属性的父项的子项覆盖。这里的实际应用是维护模型/视图系统。如果视图是从相同的基本视图类派生的,则某些视图需要使用更复杂的模型来执行其功能。

我想知道是否存在最佳实践模式,因为我目前仅隐藏变量名称空间的方法看起来太乱了。这是我的意思的一些示例伪代码:

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);

2 个答案:

答案 0 :(得分:2)

似乎您应该使您的ParentManager类通用:

public class ChildManager : ParentManager<ChildPropertyType>
{
}

public class ParentManager<T> where T: ParentPropertyType 
{
    public T PropertyType { get; set; }   
}

现在,您甚至不需要virtualoverride,因为根据所使用的类,该属性具有正确的类型。因此,以下编译很好,因为PropertyType返回了一个实例。 ChildPropertyType:

var manager = new ChildManager();
ChildPropertyType c = manager.PropertyType;

答案 1 :(得分:0)

在C#中,无法重写方法并将其返回类型更改为后代类型。 “悲伤但真实”。

如果我是你,我将重新引入(使用“ new”)方法/属性以返回所需的类型。