不使用抽象类而不是接口的原因?

时间:2011-04-24 03:58:00

标签: f#

我正在考虑使用带有所有抽象成员而不是接口的抽象类,以避免显式接口实现样板代码。而不是

type IMyInterface =
    abstract Name : string
    abstract Text : string

type MyClass() =
    member __.Name = "name"
    member __.Text = "text"
    interface IMyInterface with
        member this.Name = this.Name
        member this.Text = this.Text

我有

[<AbstractClass>]
type MyAbstractClass() =
    abstract Name : string
    abstract Text : string

type MyClass() = 
    inherit MyAbstractClass()
    override __.Name = "name"
    override __.Text = "text"

我应该在这里注意任何谨慎或含义的词语?

3 个答案:

答案 0 :(得分:8)

只有你应该注意并做出有意识决定的事情是一个类只能从一个类继承,但实现了许多接口。


除此之外,还有一些关于使用抽象类或接口的建议:

  
      
  • 如果您预计要创建组件的多个版本,请创建一个   抽象类。抽象类   提供一种简单易行的方法   版本你的组件。通过更新   基类,所有继承类   自动更新   更改。接口,另一方面,   一旦创建就无法更改。如果一个   新版本的界面是   必需的,你必须创建一个全新的   接口
  •   
  • 如果您正在创建的功能在整个范围内有用   不同对象的范围,使用   接口。应该是抽象类   主要用于对象   密切相关,而接口   最适合提供共同点   不相关类的功能。
  •   
  • 如果您正在设计小巧,简洁的功能,请使用   接口。如果你正在设计大型   功能单元,使用摘要   类。
  •   
  • 如果您想在所有人中提供通用的,已实现的功能   您的组件的实现,使用   一个抽象的类。抽象类   允许你部分实现你的   class,而接口不包含   任何成员的实施。
  •   

http://msdn.microsoft.com/en-us/library/scsyfw1d%28vs.71%29.aspx

就个人而言,我觉得这些建议都是正确的。特别是接口,一旦创建就无法更改。如果需要新版本的界面,则必须创建一个全新的界面。是非常重要的一点。

答案 1 :(得分:4)

斯蒂芬

只有一个,最基本,最明显......一个接口允许替代实现;如果“已发布的知识类型”是一个抽象类,您以后不能提供任何替代方案......所以缺点是您限制了未来的选择;好处是(取决于有多少继承人)你可以节省很多锅炉板代码。

如果你真的确定没有其他有效的实现,那么去抽象类。如果没有,那么坚持接口。

我想你们两个都可以做到......而且我想这会给你们两个世界中最好的东西。

干杯。基思。

PS:manojlds是对的,当然......而且更加成功; - )

答案 2 :(得分:2)

在抽象类中,您可以实现所有子类的一些常见行为。

在您的界面设计中,您可能希望使用方法调用其他方法来完成某些复合任务。例如,predictAll(Instance array)可以使用predictSingle(Instance)并为所有子类提供默认实现。如果使用interface,则需要在所有子类中实现predictAll

但是这一点与多重继承一样并不重要。我更喜欢界面而不是抽象类。

界面还可以保持您的设计流畅。

还有一点: 与抽象类相比,接口鼓励更多功能代码。 Haskell中的类型类是一个更强大的接口。