2012-05-29 137 views
0

C# Accessing a subclass property复制特定属性 - 查看其他解决方案的方法存在。设计模式在子类

我有一个对象模型,其中每个对象都有一个父对象,我想访问具有每个对象的特定类型的父属性。所以例如车轮应拥有Car类型的父母财产。我的猜测是,有一个既定的设计模式来实现这一点(在.NET中)。但是,我还没有找到这样的设计我想出了这个样子的

public class BaseObject<T> where T : BaseObject<T> 
{ 
    private T mParent; 
    protected T Parent 
    { 
     get { return mParent; } 
    } 

    public BaseObject(T parent) 
    { 
     mParent = parent; 
    } 

    public void Save() ... 
    public void Delete() ... 
    public BaseObject<T> Clone() ... 
} 

public class Car : BaseObject<Car> 
{ 
    public Car(Car parent) : base(parent) 
    { 
    } 

    public bool Is4WD() 
    { 
     return true; 
    } 
} 

public class Wheel : BaseObject<Car> 
{ 
    public Wheel(Car parent) : base(parent) 
    { 
    } 

    public float RequiredTirePressure() 
    { 
     return Parent.Is4WD() ? 3.0f : 2.5f; 
    } 
} 

你看到任何设计或性能缺点这种做法?你能推荐一个更好的设计吗?

+3

你想解决什么问题?使用泛型非常不简单。 – jgauffin

+0

我的数据是由一个对象树与可能这反过来又可能有自己的孩子等子对象要做到这一点每个对象都有它的父级的引用在那里可以注册/注销主要对象。在许多情况下,子对象访问父对象的方法/属性。一种方法是将父类属性从基类型转换为正确类型,但我想知道是否有类型安全声明的方法。 –

+0

Liskovs Substitution Principle说任何接受基类的方法都应该适用于所有不同的子类。你所要求的是违反该原则,因此不是真正的“是”关系。如果你能用真实的类名来说明你的问题,而不是你现在添加的抽象名称,那会更好。 – jgauffin

回答

3

的答案是使用composition instead of inheritance。车轮不是汽车,所以它不应该从Car延伸。相反,应该让Wheel采取Car在其构造。

例如:

public class Wheel { 
    private Car car; 

    public Wheel(Car car) { 
     this.car = car; 
    } 

    public float RequiredTirePressure() { 
     return car.Is4WD() ? 3.0f : 2.5f; 
    } 
} 
+0

有道理你在说什么。我想我心里想的是[Rockford Lhotka的CSLA .NET框架](http://www.lhotka.net/cslanet/Default.aspx)。他有一个BusinessBase类,它具有一些其他类继承的基本功能(在我的示例中,Wheel也扩展了BaseObject而不是Car)。父属性的类型是IParent。你会建议在这种情况下投入IParent到特定类型? –

+0

我会随你的建议去使用一个具有子对象的特定类型的引用(除了基础对象中的引用)。然而,我必须承认,我并没有完全放弃以一种似乎被接受的方式完全抛弃继承,例如在CSLA .NET框架中。 –