这是抽象类的候选人吗?

时间:2012-11-21 21:31:16

标签: c#

让我们说我想在一个地方收集所有运动的所有常见属性和行为。为了这个目的,我想将SportBase用作抽象类,但我不确定。我试图理解这个例子中抽象与接口使用之间的差异。

每项运动都应具备以下属性

  • DateTime Started;
  • DateTime Ended;
  • string Name;

如果我将这些属性声明为整数,稍后我会决定将Game对象用作Game StartGame之类的独立实体。我没有清楚地看到哪种方法可以使用高级抽象来减少以后修改时的痛苦(这种修改可以添加新属性,新行为等)。

由于

4 个答案:

答案 0 :(得分:3)

如果您只有属性和空方法,那么界面可能是您更好的选择。如果你有一些实际的代码,那么抽象类是你唯一的选择。还要记住,你只能继承一个抽象类,但实现多个接口。

答案 1 :(得分:2)

不,我不会那样做。你最终会创建一个抽象的God class,它有很多责任。

答案 2 :(得分:2)

您可以使用界面提供代码合同。

public interface ISportsEvent
{
    DateTime Start { get; set; }
    DateTime End { get; set; }
    string Name { get; set; }
}

但这并没有为您提供可重用的实现

作为一般规则,您应该更喜欢构图而不是继承。

所以做这样的事情通常会更好

public interface EventDetails
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public string Name { get; set; }
}


public class SportingEvent
{

    public EventDetails Details {get;set;}
}

现在这有点粗糙,但你可以看到我得到的东西。

答案 3 :(得分:1)

我个人可能会把它变成一个抽象的课程,因为你的体育不仅会分享一些领域,而且它们也可能有一些逻辑。

接口不是用于分离重复的代码,但它们纯粹是为了多态。

所有界面都能确保您的班级以某种方式行事。如果您计划在基类中放置逻辑而不是您想要的抽象类。