2010-08-25 18 views
2

请使用抽象(MustInherit在Visual Basic中)类而不是接口来将实施与合同分离。需要说明:抽象类首选接口。原因:他们将合同与实施分离

以上是微软提供的"Type design guideline"。我对此有点困惑。我一直认为接口将合同与实施解耦。上述准则究竟意味着什么?

感谢

+2

接口的问题在于,一旦你将它们释放给公众,就不能在不破坏所有编译的情况下更新它。抽象类可以随时添加非抽象方法而不会破坏任何内容。 – Powerlord 2010-08-25 17:49:33

回答

1

两个抽象类和接口可以“脱钩实现合同”。在一个抽象类中,方法可以被声明为抽象的,没有实现,就像使用接口一样。对于这样的方法,dervived类必须提供一个带有实现的Override方法,就像使用接口一样。

抽象类和接口之间的区别在于抽象类可以包含一些具有实现的成员,然后它们将在所有派生类中共享,并且可以包含私有/受保护的字段(“状态” ),界面显然不能。

+1

是的。我知道抽象类和接口之间的区别。这是如何解释上述指导原则的? – stackoverflowuser 2010-08-25 17:50:42

1

我认为这是字面意思。如果你想将契约与实现分开,他们建议你使用抽象类而不是接口。

我明白他们正在做的建议是,当您需要与自定义值类型相关的多态性,或者如果您想要多重继承,或者因为类型将有大量的实现者时,您使用接口。例如,IDisposable通常会与多个其他接口一起继承,而IDisposable则由大量不同的类实现,因此它作为接口的规则是有意义的。

如果您的合同不会与其他合同一起实施,并且将由8个或10个不同的成员实施,那么抽象类通过我阅读的方式是有意义的。

1

接口确实将实施中的合同解耦。您所引用的类型设计指南并不意味着接口对于将契约与实现分离的效果不佳 - 它意味着接口具有抽象类所没有的额外限制,因此如果您有选择,这些指南建议您倾斜当你想定义一个没有实现的合约而不是自动定义一个接口时,定义抽象类。

在设计应用程序内的合同时,这可能是公平的建议。但是,如果合约将在应用程序之外使用,例如通过COM或.NET远程处理进行的进程调用,或者跨越不同语言(.NET之外),则接口具有明显的优势。当你需要绝对的独立性和实现的独立性时,接口比抽象类更好。为了您的应用程序中的方便性和长期灵活性(并且不需要绝对隔离接口),指南建议您可以使用抽象类而不是接口。

准则的措辞部分反映了人们倾向于过度使用接口,这可能会导致不必要的混乱和冗余实施代码。