.net 子类中专门属性的设计模式

.net 子类中专门属性的设计模式,.net,oop,design-patterns,inheritance,subclass,.net,Oop,Design Patterns,Inheritance,Subclass,重复-请参阅此处的其他解决方案方法。 我有一个对象模型,其中每个对象都有一个父对象,我希望使用每个对象的特定类型访问父属性。因此,例如,车轮应具有Car类型的父属性。我的猜测是,有一个既定的设计模式来实现这一点(在.NET中)。然而,我还没有找到它,所以我提出的设计看起来像这样 public class BaseObject<T> where T : BaseObject<T> { private T mParent; protected T Parent

重复-请参阅此处的其他解决方案方法。

我有一个对象模型,其中每个对象都有一个父对象,我希望使用每个对象的特定类型访问父属性。因此,例如,车轮应具有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;
    }
}
公共类BaseObject,其中T:BaseObject
{
私人租金;
受保护T型双亲
{
获取{return mParent;}
}
公共BaseObject(T父对象)
{
mParent=父母;
}
public void Save()。。。
public void Delete()。。。
公共BaseObject克隆()。。。
}
公共级汽车:BaseObject
{
公共车辆(车辆父级):基本(父级)
{
}
公共布尔Is4WD()
{
返回true;
}
}
公共类控制盘:BaseObject
{
公共车轮(车辆父级):基础(父级)
{
}
所需公共浮子轮胎压力()
{
返回父级.Is4WD()?3.0f:2.5f;
}
}
您是否看到这种方法在设计或性能方面存在任何缺陷?你能推荐一个更好的设计吗?

答案是使用。车轮不是汽车,因此它不应该从
汽车
伸出。相反,让
车轮
在其构造中取一辆
汽车

例如:

public class Wheel {
    private Car car;

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

    public float RequiredTirePressure() {
        return car.Is4WD() ? 3.0f : 2.5f;
    }
}
    • 答案是使用。车轮不是汽车,因此它不应该从
      汽车
      伸出。相反,让
      车轮
      在其构造中取一辆
      汽车

      例如:

      public class Wheel {
          private Car car;
      
          public Wheel(Car car) {
              this.car = car;
          }
      
          public float RequiredTirePressure() {
              return car.Is4WD() ? 3.0f : 2.5f;
          }
      }
      

      您想解决什么问题?与泛型混为一谈很少是个好主意。我的数据由一个对象树组成,其中一个主对象可能有子对象,而子对象又可能有自己的子对象等。为了实现这一点,每个对象都有一个对其父对象的引用,可以在其中注册/取消注册。在许多情况下,子对象访问其父对象的方法/属性。一种方法是将父属性从基类型强制转换为正确的类型,但我想知道是否有一种类型安全声明的方法。Liskovs替换原则说,任何采用基类的方法都应该适用于所有不同的子类。您所要求的是违反该原则,因此不是真正的
      is-a
      关系。如果你能用真实的类名而不是你现在添加的抽象名来说明你的问题,那就更好了。我试图通过使用特定的类名来使这个例子更有意义(很抱歉,我不能在这里使用真实的名称)。这说明了我在寻找什么吗?不,我不知道“BaseObject”的用法。重点是什么?你想解决什么问题?与泛型混为一谈很少是个好主意。我的数据由一个对象树组成,其中一个主对象可能有子对象,而子对象又可能有自己的子对象等。为了实现这一点,每个对象都有一个对其父对象的引用,可以在其中注册/取消注册。在许多情况下,子对象访问其父对象的方法/属性。一种方法是将父属性从基类型强制转换为正确的类型,但我想知道是否有一种类型安全声明的方法。Liskovs替换原则说,任何采用基类的方法都应该适用于所有不同的子类。您所要求的是违反该原则,因此不是真正的
      is-a
      关系。如果你能用真实的类名而不是你现在添加的抽象名来说明你的问题,那就更好了。我试图通过使用特定的类名来使这个例子更有意义(很抱歉,我不能在这里使用真实的名称)。这说明了我在寻找什么吗?不,我不知道“BaseObject”的用法。重点是什么?你说的有道理。我想我心里想的大概是。他有一个类BusinessBase,其中包含一些基本功能,其他类从中继承(在我的示例中,Wheel还扩展了BaseObject,而不是Car)。父属性的类型为IParent。在这种情况下,您是否建议将IParent强制转换为特定类型?我同意您的建议,在子对象中使用特定类型的引用(除了基对象中的引用之外)。然而,我必须承认,我并没有完全同意完全放弃以一种似乎被接受的方式使用的继承,例如在CSLA.NET框架中。你说的有道理。我想我心里想的大概是。他有一个类BusinessBase,其中包含一些基本功能,其他类从中继承(在我的示例中,Wheel还扩展了BaseObject,而不是Car)。父属性的类型为IParent。在这种情况下,您是否建议将IParent强制转换为特定类型?我同意您的建议,在子对象中使用特定类型的引用(除了基对象中的引用之外)。然而,我必须承认,我并没有完全同意完全放弃以一种似乎被接受的方式使用的继承,例如在CSLA.NET框架中。