接口与基类

接口与基类

什么时候应该使用接口,什么时候应该使用基类?

如果我不想实际定义方法的基本实现,那么它应该始终是一个接口吗?

如果我有狗和猫课。为什么我想要实现IPet而不是PetBase呢?我可以理解ISheds或IBarks的接口(IMakesNoise?),因为它们可以通过宠物放置在宠物上,但我不知道通用宠物使用哪种接口。


暮色呼如
浏览 686回答 3
3回答

慕虎7371278

让我们以狗和猫类为例,让我们用C#来说明:狗和猫都是动物,特别是四足哺乳动物(动物太普遍了)。让我们假设你有一个抽象的哺乳动物类,它们都是:public&nbsp;abstract&nbsp;class&nbsp;Mammal此基类可能具有默认方法,如:饲料配偶所有这些行为在任何一个物种之间都有或多或少相同的实现。要定义这一点,您将拥有:public&nbsp;class&nbsp;Dog&nbsp;:&nbsp;Mammalpublic&nbsp;class&nbsp;Cat&nbsp;:&nbsp;Mammal现在让我们假设还有其他哺乳动物,我们通常会在动物园看到:public&nbsp;class&nbsp;Giraffe&nbsp;:&nbsp;Mammalpublic&nbsp;class&nbsp;Rhinoceros&nbsp;:&nbsp;Mammalpublic&nbsp;class&nbsp;Hippopotamus&nbsp;:&nbsp;Mammal这仍然是有效的,因为在功能的核心Feed()和Mate()还是一样的。然而,长颈鹿、犀牛和河马并不完全是你可以用来做宠物的动物。在这里,接口将是有用的:public&nbsp;interface&nbsp;IPettable{ &nbsp;&nbsp;&nbsp;&nbsp;IList<Trick>&nbsp;Tricks{get;&nbsp;set;} &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Bathe(); &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Train(Trick&nbsp;t);}上述契约的实现在猫和狗之间将是不一样的;将它们的实现放在一个抽象类中进行继承将是个坏主意。您的狗和猫定义现在应该如下所示:public&nbsp;class&nbsp;Dog&nbsp;:&nbsp;Mammal,&nbsp;IPettablepublic&nbsp;class&nbsp;Cat&nbsp;:&nbsp;Mammal,&nbsp;IPettable理论上,您可以从更高的基类重写它们,但从本质上说,接口允许您只将所需的内容添加到类中,而不需要继承。因此,因为通常只能从一个抽象类继承(在大多数静态类型的OO语言中,即.异常包括C+),但能够实现多个接口,它允许您严格地构造对象视需要基础。

慕的地10843

乔希·布洛赫自己说有效Java 2d:比抽象类更喜欢接口一些要点:现有的类可以很容易地进行修改,以实现新的接口。..您所要做的就是添加所需的方法(如果它们还不存在),并向类声明中添加一个Implements子句。接口是定义混合器的理想方法。..松散地说,Mixin是一个类除了它的“主类型”之外还可以实现的类型,以声明它提供了一些可选的行为。例如,可比较是一个混合接口,它允许类声明其实例是相对于其他相互比较的对象排序的。接口允许构造无层次的类型框架。..类型层次结构对于组织某些事情是很好的,但是其他的事情并不能整齐地归入一个僵化的层次结构中。接口支持安全、强大的功能增强。通过每班包装成语。如果您使用抽象类来定义类型,那么您将使希望添加功能的程序员别无选择,只能使用继承。此外,您可以结合接口和抽象类的优点,提供一个抽象的框架实现类来与您导出的每个重要接口一起使用。另一方面,界面很难进化。如果将一个方法添加到一个接口中,它将破坏它的所有实现。PS:买这本书。这要详细得多。

梦里花落0921

现代风格就是定义ipet和佩特基。该接口的优点是其他代码可以使用它,而不与其他可执行代码有任何联系。完全“干净”此外,接口也可以混合。但是基类对于简单的实现和常见的实用程序很有用。因此,还提供一个抽象基类来节省时间和代码。
打开App,查看更多内容
随时随地看视频慕课网APP