0

我读到只有当你想使用覆盖工具时才应该使用继承。如果您仅将继承用于代码共享,则应使用接口和组合。看看下面的代码:

Public Class Animal
    Public Overridable Sub Eat()
        MsgBox("Animal Eat no arguement")
    End Sub
End Class

Public Class Horse
    Inherits Animal
    Public Overrides Sub Eat()
        MsgBox("Horse Eat no arguement")
    End Sub
End Class

Horse 继承自 Animal 并覆盖 Eat。根据我阅读的内容,这是对继承的有效使用。现在假设您添加了一个继承自 animnal 的 Cat 类和 Dog 类。现在说那匹马;Cat 和 Dog 使用 Animal 类中的 Eat 函数(而不是覆盖它),那么根据我读到的内容,这是对继承的无效使用(应该使用接口)。当然,如果您使用接口(即 IEatable)来实现 Eat 接口,则必须在每个类中编写 Eat,这会最大程度地降低可重用性和可维护性。我在这里想念什么?

更新阅读回复后,我相信我可以做这样的事情:

 Public Class Animal
    Public Overridable Sub Eat()
        MsgBox("Animal Eat no arguement")
    End Sub
End Class

Public Class Fish
    Inherits Animal
    Implements ISwim
    Private s1 As New Swim
    Public Sub Swim() Implements ISwim.Swim
        s1.Swim()
    End Sub
End Class

Public Class Shark
    Inherits Animal
    Implements ISwim
    Private s1 As New Swim
    Public Sub Swim() Implements ISwim.Swim
        s1.Swim()
    End Sub
End Class

Public Class Elephant

End Class

Public Class Swim
    Public Sub Swim()
        MsgBox("Animal can swim")
    End Sub
End Class

Public Interface ISwim
    Sub Swim()
End Interface

在上面的代码中,三只动物中的两只实现了 ISwim,并使用组合来提供 Swim 的实现。这是一种有效的方法吗?

4

2 回答 2

2

Eat如果您可以对所有或部分类使用相同的代码,您将使用继承来实现。如果您需要某些类的不同实现,您可以将其设为虚拟并使用Animal任何没有具体实现的类中的实现。

如果您对所有类都有不同的实现,或者您只想向某些类添加功能,您将使用接口。例如,该ISwim接口将仅由某些动物实现。

于 2013-01-28T19:45:08.453 回答
1

应该使用继承来建模IS-A关系。因为Horse是一种类型, Animal所以在这里继承是非常有意义的——代码重用不在讨论之列。

大多数情况下,许多类型的动物都有共同的行为,因此您可以看到代码共享在起作用。但是共享实现是层次结构正确建模问题域的结果,而不是继承的原因。

当您有许多共享默认实现的动物类型时,请在基类中提供该实现Animal。当没有适用于大多数动物的明显实现时(或者当您想强制动物的创建者明确说明他们希望如何实现行为时),请使用抽象函数。当有不相关类型的对象具有相似的行为(例如,飞机和麻雀都可以飞行)并且并非所有类型的动物都表现出给定的行为时,使用接口(例如)描述共同行为是有意义的IFlightCapable

于 2013-01-28T19:44:47.590 回答