假设我想在一个地方收集所有运动的所有常见属性和行为。为此,我正在考虑使用 SportBase 作为抽象类,但我不确定。我试图了解此示例中抽象与接口使用之间的区别。
每项运动都应具有以下属性
- 日期时间开始;
- 日期时间结束;
- 字符串名称;
如果我声明这些属性(如整数),然后我决定使用 Game 对象作为独立实体(如 Game StartGame)。我不清楚使用哪种方法具有高度抽象性来减少后期修改的痛苦(这种修改可以添加新属性、新行为等)
谢谢
假设我想在一个地方收集所有运动的所有常见属性和行为。为此,我正在考虑使用 SportBase 作为抽象类,但我不确定。我试图了解此示例中抽象与接口使用之间的区别。
每项运动都应具有以下属性
如果我声明这些属性(如整数),然后我决定使用 Game 对象作为独立实体(如 Game StartGame)。我不清楚使用哪种方法具有高度抽象性来减少后期修改的痛苦(这种修改可以添加新属性、新行为等)
谢谢
如果您只有属性和空方法,那么接口可能是您更好的选择。如果您有一些实际代码,那么抽象类是您唯一的选择。还要记住,您只能继承一个抽象类,但可以实现多个接口。
不,我不会那样做。你最终会创建一个抽象的上帝类,它有很多职责。
您可以使用接口来提供要编码的合同。
public interface ISportsEvent
{
DateTime Start { get; set; }
DateTime End { get; set; }
string Name { get; set; }
}
but that doesn't give you a reusable implementation
As a general rule you should prefer composition over inheritance.
So its often better to do something like this
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;}
}
now this is a bit rough but you can see what I'm getting at.
我个人可能会把它变成一个抽象类,因为你的运动不仅会共享一些领域,而且它们也可能会共享一些逻辑。
接口不是用于分离重复代码,而是纯粹用于多态性。
接口所做的只是保证您的类将以某种方式运行。如果您打算将逻辑放在基类中,而不是需要一个抽象类。