Я не совсем понимаю, почему и когда использовать интерфейсы. Может ли кто-нибудь опубликовать полный, простой и маленький пример интерфейса с помощью VB.NET в консольном приложении. Как это расширяемо?Интерфейсы VB.NET
ответ
Короче: Фавор Состав над наследованием
Интерфейсы просто общий набор определений членов, которые вы хотите один или несколько классов для поддержки. Ключ в том, что вы должны явно предоставлять функциональность при реализации интерфейса.
Вы можете добиться аналогичных результатов, используя наследование, поскольку два подкласса могут наследовать полностью функциональные элементы из базы. Но недостатком наследования является то, что ваши подклассы в конечном итоге имеют жесткую зависимость от базового класса.
Рассмотрим следующие классы:
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!
A * очень * приятный, легкий для понимания и вполне разумный пример. Престижность! Вы учитель или что-то подобное? :) – pepoluan
Нет, просто кто-то еще в траншеях, иногда протягивая руку. Кажется, я читал книги «Первая книга» в то время, когда писал это, и некоторые из их стилей стирались! – Technobabble
Отличное объяснение использования реализации и наследования. Один комментарий, удалите() в конце явных инструментов. Например, реализует IOpenable.OpenDoor() следует читать Реализации IOpenable.OpenDoor –
Рассмотрим простой интерфейс:
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
то я могу вычислить среднее взвешенное для коллекции экземпляров этого класса.
Чувствую, что я почти понимаю цель интерфейсов, но до сих пор он еще не совсем щелкнул. Может быть, мне нужно вернуться и прочитать это через пару дней. Я сделаю +1, если вы дадите мне другой пример или каким-то образом выработаете. – Lopsided
- 1. Интерфейсы веб-камеры в VB.net
- 2. C# для VB.NET: Наследование и интерфейсы
- 3. Интерфейсы VB.Net и абстрактные классы: wpf окна, имеющие общую функциональность
- 4. Динамически масштабированные пользовательские интерфейсы с помощью VB.NET WinForms?
- 5. API-интерфейсы sendmessage и sendmessagetimeout, совместимые с VB.NET.
- 6. Родовые интерфейсы
- 7. Java - интерфейсы
- 8. О интерфейсы
- 9. Интерфейсы проектирования
- 10. Сериализация интерфейсы
- 11. статических интерфейсы
- 12. .NET Интерфейсы
- 13. Интерфейсы реализации
- 14. PHP-интерфейсы
- 15. Абстрактные интерфейсы
- 16. Интерфейсы DAOImpl
- 17. Java-интерфейсы
- 18. Интерфейсы экспорта
- 19. Частные интерфейсы
- 20. Стандартные интерфейсы
- 21. Внутренние интерфейсы?
- 22. Нахождение Интерфейсы
- 23. Интерфейсы Solr
- 24. Способы и интерфейсы по умолчанию, расширяющие другие интерфейсы
- 25. Зачем использовать интерфейсы, множественное наследование и интерфейсы, преимущества интерфейсов?
- 26. API интерфейсы не должны распространяться другие интерфейсы Модифицированные 2
- 27. Составляющие интерфейсы в C++
- 28. JPA аннотации и интерфейсы
- 29. AutoFixture и интерфейсы
- 30. Java общие интерфейсы
Возможный дубликат http://stackoverflow.com/questions/1983962/how-do-interfaces-work-and-how-to-use-them-in-practical-programming –
Или http: // stackoverflow. com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them – Walter
Я бы предложил прочитать «Программирующие компоненты Juval Lowy в .NET»; это прочная книга для объяснения множества различных важных концепций, а интерфейсы хорошо освещены. – STW