在建模OOP时属性应该驻留在哪里?包括一个小例子

本文关键字:包括一 在哪里 OOP 建模 属性 | 更新日期: 2023-09-27 18:16:09

我希望学习如何有效地使用接口和基类。我不太确定公共属性应该放在哪里?是否只有行为属于接口?如果像:Color和MinSpeed这样的属性不应该出现在界面中,那么它们应该放在哪里呢?在抽象类中?

public interface IVehicle
{
    void Speed();
    void Clean();
    void Stop();
}
public class Bmw : IVehicle
{
    // Because these pertain to every vehicle no matter of maker,
    // should these propertes go in the interface? Or in an abstract class?
    public string Color { get; set; }
    public int MinSpeed { get; set; }
    #region IVehicle Members
    public void Speed()
    {
    }
    public void Clean()
    {
    }
    public void Stop()
    {
    }
    #endregion
}

在建模OOP时属性应该驻留在哪里?包括一个小例子

接口可以被认为是任何实现类都必须满足的契约。如果你想保证所有的类都做同样的事情——满足同样的api——但你不关心如何做到这一点,就使用它。如果属性是该API的一部分,那么无论如何都要在接口中包含它们。

从上面的例子中,如果你想让所有的汽车保证有一个颜色和minSpeed,那么这些属性属于接口。如果这些属性仅针对BMW,那么它们属于BMW类。如果这些属性属于某些类而不属于其他类,则可以创建一个扩展原始接口的新接口:

public interface IVehicleWithColorAndMinSpeed : IVehicle
{
    string Color { get; set; }
    int MinSpeed { get; set; }
}

(不要被这个冲昏头脑)


抽象类是类似的,但允许您为子类提供默认实现。

抽象类往往更容易版本化,因为你可以添加一些新的东西到你的API,并提供一个默认的实现,你现有的子类将自动拾取;向接口添加内容会立即破坏实现该接口的所有现有类。

正确的答案完全取决于你的领域模型。你想要解决的问题是什么?除了能最大限度地解决手头特定问题的答案外,没有"正确"的答案:

  • 可理解性
  • <
  • 可维护性/gh>
  • <
  • 隔离/gh>

你可能会认为这些属性中的大多数是按重要性排序的,但它们对不同的人意味着不同的东西,可能也隐含着很多争论。

你能告诉我们更多关于你想象这些类服务的特定应用程序吗?