在建模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
}
接口可以被认为是任何实现类都必须满足的契约。如果你想保证所有的类都做同样的事情——满足同样的api——但你不关心如何做到这一点,就使用它。如果属性是该API的一部分,那么无论如何都要在接口中包含它们。
从上面的例子中,如果你想让所有的汽车保证有一个颜色和minSpeed,那么这些属性属于接口。如果这些属性仅针对BMW,那么它们属于BMW类。如果这些属性属于某些类而不属于其他类,则可以创建一个扩展原始接口的新接口:public interface IVehicleWithColorAndMinSpeed : IVehicle
{
string Color { get; set; }
int MinSpeed { get; set; }
}
(不要被这个冲昏头脑)
抽象类是类似的,但允许您为子类提供默认实现。
抽象类往往更容易版本化,因为你可以添加一些新的东西到你的API,并提供一个默认的实现,你现有的子类将自动拾取;向接口添加内容会立即破坏实现该接口的所有现有类。
正确的答案完全取决于你的领域模型。你想要解决的问题是什么?除了能最大限度地解决手头特定问题的答案外,没有"正确"的答案:
- 可理解性 <
- 可维护性/gh>
- <
- 隔离/gh>
你可能会认为这些属性中的大多数是按重要性排序的,但它们对不同的人意味着不同的东西,可能也隐含着很多争论。
你能告诉我们更多关于你想象这些类服务的特定应用程序吗?