【问题标题】:Design pattern for specialized properties in subclasses子类中特殊属性的设计模式
【发布时间】:2012-06-03 23:55:56
【问题描述】:

C# Accessing a subclass property 的重复 - 在那里查看其他解决方案。

我有一个对象模型,其中每个对象都有一个父对象,我想使用每个对象的特定类型访问父属性。所以例如Wheel 应该有一个 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;
    }
}

您是否发现这种方法存在任何设计或性能缺陷?你能推荐一个更好的设计吗?

【问题讨论】:

  • 您要解决什么问题?与泛型混在一起并不是一个好主意。
  • 我的数据由一个对象树组成,其中一个主对象可能有子对象,而子对象又可能有自己的子对象等。为此,每个对象都有对其父对象的引用,它可以在其中注册/注销.在许多情况下,子对象访问其父对象的方法/属性。一种方法是将父属性从基类型转换为正确的类型,但我想知道是否有一种方法可以进行类型安全声明。
  • Liskovs 替换原则说,任何采用基类的方法都应该适用于所有不同的子类。您要问的是违反了该原则,因此不是真正的is-a 关系。如果你能用真实的类名而不是你现在添加的抽象名来说明你的问题会更好。
  • 我试图通过使用特定的类名来使示例更有意义(对不起,我不能在这里使用实名)。这是否表明我在寻找什么?
  • 没有。我没有得到“BaseObject”的用法。有什么意义?

标签: .net oop design-patterns inheritance subclass


【解决方案1】:

答案是使用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;
    }
}

【讨论】:

  • 你说的有道理。我想我的想法类似于Rockford Lhotka's CSLA .NET framework。他有一个 BusinessBase 类,它具有一些其他类继承的基本功能(在我的示例中,Wheel 还扩展了 BaseObject 而不是 Car)。父属性的类型为 IParent。在这种情况下,您是否建议将 IParent 转换为特定类型?
  • 我会同意您的建议,即对子对象使用特定类型的引用(除了基础对象中的引用)。然而,我必须承认我并没有完全接受完全放弃以似乎被接受的方式使用的继承,例如。在 CSLA .NET 框架中。
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多