界面最小化了可重用性和可维护性

时间:2013-01-28 19:38:06

标签: vb.net design-patterns

我读到只有在你想使用覆盖设施时才应该使用继承。如果仅使用继承进行代码共享,则应使用接口和组合。看看下面的代码:

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

马继承自动物并覆盖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的实现。这是一种有效的方法吗?

2 个答案:

答案 0 :(得分:2)

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

如果您对所有类具有不同的实现,或者如果您想要仅为某些clases添加该功能,则可以使用接口。例如,ISwim接口仅由某些动物实现。

答案 1 :(得分:1)

继承应该用于建模IS-A关系。由于HorseAnimal的一种类型,因此在此处继承是完全合理的 - 并且代码重用不会进入讨论。

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

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