2011-11-30 62 views
1

我在学习如何有效地使用接口和基类。我不确定在哪里放置共同的属性?只有行为属于界面吗?如果像Color和MinSpeed这样的属性不应该进入界面,他们应该在哪里生活?在抽象类中?建模OOP时,属性应该在哪里?小示例包括

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 
} 
+0

请注意属性_are_行为,作为属性是getter/setter。虽然有强烈的期望,获取/设置一个属性的行为是以“类似数据”的方式进行,但没有义务确定某个属性实际上“包含”了数据。这里真正的问题是需要访问改变这些属性的行为;考虑一下你的接口的预期用例,这会让你了解通过接口公开“属性数据”是否合理。 –

回答

1

接口可以被认为是任何实施类必须满足的合同。如果你想保证所有的课程都做同样的事情 - 满足相同的API - 但是你不在意他们如何做到这一点如果属性是该API的一部分,那么通过所有方法将它们包括在您的接口中。

从你上面的例子中,如果你想所有的汽车保证有一个颜色和minSpeed,那么这些属性属于界面。如果这些属性仅针对宝马车型,那么他们属于宝马车型。如果这些属性属于某个类,但不是别人,你可以创建一个新的接口扩展原始之一:

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

(只是没有得到与此忘乎所以)


摘要类是相似的,但允许您为子类提供默认实现。

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

+0

感谢您的帮助。头仍然试图把它放在一起。想想如果我想将所有车辆的默认颜色设置为红色,该怎么做。 – Frankie

+0

@Frankie - 你可以看看这个工厂的方法。这只是一种可能的方式;还有很多其他的。 –

+0

工厂基本上会给我一个颜色设置为“红色”的BMW对象? IVehicle bmw = Factory.GetBMW(); – Frankie

0

'正确'的答案完全取决于你的领域模型。你想解决什么问题?没有比它在手与最大的解决特定问题的另外一个没有“正确”的答案:

  • 可理解
  • 可维护性
  • 简洁
  • 隔离
  • 性能

你或许可以认为大多数这些属性是按重要性排序的,但它们对于不同的人来说意味着不同的东西而且这里也可能有很多辩论。

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