2010-05-05 2 views
6

Я не совсем понимаю, почему и когда использовать интерфейсы. Может ли кто-нибудь опубликовать полный, простой и маленький пример интерфейса с помощью VB.NET в консольном приложении. Как это расширяемо?Интерфейсы VB.NET

+2

Возможный дубликат http://stackoverflow.com/questions/1983962/how-do-interfaces-work-and-how-to-use-them-in-practical-programming –

+0

Или http: // stackoverflow. com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them – Walter

+0

Я бы предложил прочитать «Программирующие компоненты Juval Lowy в .NET»; это прочная книга для объяснения множества различных важных концепций, а интерфейсы хорошо освещены. – STW

ответ

29

Короче: Фавор Состав над наследованием

Интерфейсы просто общий набор определений членов, которые вы хотите один или несколько классов для поддержки. Ключ в том, что вы должны явно предоставлять функциональность при реализации интерфейса.

Вы можете добиться аналогичных результатов, используя наследование, поскольку два подкласса могут наследовать полностью функциональные элементы из базы. Но недостатком наследования является то, что ваши подклассы в конечном итоге имеют жесткую зависимость от базового класса.

Рассмотрим следующие классы:

Public Class Car 
    Publc Sub OpenDoor(ByVal key As MyKey) 
     Console.WriteLine("Access granted to car.") 
    End Sub 
End Class 

Public Class House 
    Public Sub OpenDoor(ByVal key as MyKey) 
     Console.WriteLine("Access granted to house.") 
    End Sub 
End Class 

Можно сказать, что эти два класса несколько связаны, поскольку они оба имеют метод OpenDoor(). Возможно, у вас возникнет соблазн создать базовый класс для извлечения общей функциональности.

Public Class OpenableProperty 
    Public Sub OpenDoor(ByVal key As MyKey) 
     Console.WriteLine("Access granted to property.") 
    End Sub 
End Class 

Public Class Car 
    Inherits OpenableProperty 
End Class 

Public Class House 
    Inherits OpenableProperty 
End Class 

Вы могли бы использовать эту абстракцию, как это:

Public Class SecurityService 
    Public Sub InspectProperty(ByVal item As OpenableProperty) 
     Dim key As New MyKey() 
     Console.WriteLine("Inspecting property...") 
     item.OpenDoor(key) 
    End Sub 
End Class 

Однако в отношении дома к машине, основанной исключительно на том, что вы можете получить к ним доступ с помощью ключа является довольно слабой абстракции. Черт, даже банку бобов можно открыть!

Но есть и другие моменты, в которых может возникнуть взаимосвязь. Например, как автомобиль и дом может иметь кондиционер:

Public Class Car 
    Inherits OpenableProperty 
    Public Sub TurnOnAirConditioning() 
     Console.WriteLine("Cool breezes flowing in car!") 
    End Sub 
End Class 

Public Class House 
    Inherits OpenableProperty 
    Public Sub TurnOnAirConditioning() 
     Console.WriteLine("Cool breezes flowing in house!") 
    End Sub 
End Class 

Должен ли TurnOnAirConditioning() извлечены в базовом классе тоже? Что это связано с тем, чтобы быть OpenableProperty? Может ли класс JewelrySafe наследовать от OpenableProperty без AC? Лучший ответ в данной ситуации является извлечением интерфейсов и использовать их, чтобы составить функциональность в наших классах, а не наследует:

Public Interface IOpenable 
    Sub OpenDoor(ByVal key As MyKey) 
End Interface 

Public Interface ICoolable 
    Sub TurnOnAirConditioning() 
End Interface 

Public Class Car 
    Implements IOpenable, ICoolable 
    Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor() 
     Console.WriteLine("Access granted to car.") 
    End Sub 
    Public Sub TurnOnAirConditioning() Implements ICoolable.TurnOnAirConditioning() 
     Console.WriteLine("Cool breezes flowing in car!") 
    End Sub 
End Class 

Public Class House 
    Implements IOpenable, ICoolable 
    Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor() 
     Console.WriteLine("Access granted to house.") 
    End Sub 
    Public Sub TurnOnAirConditioning() Implements ICoolable.TurnOnAirConditioning() 
     Console.WriteLine("Cool breezes flowing in house!") 
    End Sub 
End Class 

Public Class JewelrySafe 
    Implements IOpenable 
    Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor() 
     Console.WriteLine("Access granted to jewelry safe.") 
    End Sub 
End Class 

Тогда ваши абстракции могут потребляться как таковые:

Public Class SecurityService 
    Public Sub InspectProperty(ByVal item As IOpenable) 
     Dim key As New MyKey() 
     Console.WriteLine("Inspecting property...") 
     item.OpenDoor(key) 
    End Sub 
End Class 

Public Class ThermostatService 
    Public Sub TestAirConditioning(ByVal item as ICoolable) 
     Console.WriteLine("Testing Air Conditioning...") 
     item.TurnOnAirConditioning() 
    End Sub 
End Class 

мог SecurityService затем будет использоваться для осмотра автомобилей, дома и ювелирных изделий, в то время как ThermostatService может использоваться только для проверки AC автомобиля и дома.

Sub Main() 
    Dim securityService As New SecurityService() 
    Dim thermostatService As New ThermostatService() 

    Dim house As New House() 
    Dim car As New Car() 
    Dim jewelrySafe As New JewelrySafe() 

    With securityService 
     .InspectProperty(house) 
     .InspectProperty(car) 
     .InspectProperty(jewelrySafe) 
    End With 

    With thermostatService 
     .TestAirConditioning(house) 
     .TestAirConditioning(car) 
    End With 
End Sub 

Который должен производить следующие результаты:

Inspecting property... 
Access granted to house. 
Inspecting property... 
Access granted to car. 
Inspecting property... 
Access granted to jewelry safe. 
Testing Air Conditioning... 
Cool breezes flowing in house! 
Testing Air Conditioning... 
Cool breezes flowing in car! 
+0

A * очень * приятный, легкий для понимания и вполне разумный пример. Престижность! Вы учитель или что-то подобное? :) – pepoluan

+0

Нет, просто кто-то еще в траншеях, иногда протягивая руку. Кажется, я читал книги «Первая книга» в то время, когда писал это, и некоторые из их стилей стирались! – Technobabble

+0

Отличное объяснение использования реализации и наследования. Один комментарий, удалите() в конце явных инструментов. Например, реализует IOpenable.OpenDoor() следует читать Реализации IOpenable.OpenDoor –

2

Рассмотрим простой интерфейс:

Public Interface IWeightedValue 
    Public ReadOnly Property Weight As Double 
    Public ReadOnly Property Value As Double 
End Interface 

Без даже писать больше кода, я могу начать дело с этой концепцией в других частях моего кода.Например:

Public Function GetWeightedAverage(ByVal points As IEnumerable(Of IWeightedValue)) As Double 
    Dim totalWeight As Double = 0.0 
    Dim totalWeightedValue As Double = 0.0 

    For Each point As IWeightedValue in points 
     totalWeight += point.Weight 
     totalWeightedValue += (point.Weight * point.Value) 
    Next 

    Return totalWeightedValue/totalWeight 
End Function 

И вуаля - теперь для любого класса я пишу, если я просто сделать его реализовать IWeightedValue то я могу вычислить среднее взвешенное для коллекции экземпляров этого класса.

+0

Чувствую, что я почти понимаю цель интерфейсов, но до сих пор он еще не совсем щелкнул. Может быть, мне нужно вернуться и прочитать это через пару дней. Я сделаю +1, если вы дадите мне другой пример или каким-то образом выработаете. – Lopsided

Смежные вопросы