Có thể thừa kế nhiều lần trong VB .Net không? Nếu vậy, cú pháp là gì?Có thể thừa kế nhiều lần trong VB .Net không?
Trả lời
Câu trả lời ngắn: Không
câu trả lời Hơi dài hơn: Có, nếu bạn thừa hưởng nhiều giao diện, và một lớp cơ sở duy nhất. Vì đây thường là lý do cho MI (bạn muốn triển khai nhiều giao diện), nó thường là đủ. Tuy nhiên, trong những trường hợp hiếm hoi mà MI "thực sự" hữu ích, .NET ngăn cản bạn thực hiện nó.
Có thể một cách hạn chế trong VB.Net giống như cách nó ở trong C#: thông qua Giao diện. Vì một giao diện hoạt động chủ yếu là một lớp cơ sở trừu tượng thuần túy, bạn có thể kế thừa từ nhiều lớp như bạn cần và từ một lớp thực.
Có khả năng những gì bạn muốn làm thực sự là thành phần hoặc tập hợp (xem here for design pattern). Có thể bạn đang xác định hành vi. Bạn luôn có thể thực hiện một giao diện SomeInterface trong lớp cơ sở, có một thành viên của kiểu SomeInterface (cho phép nó là bất kỳ lớp nào thực hiện SomeInterface và do đó có thể thực thi mã), trong constructor thành viên chuyển một tham chiếu đến lớp cơ sở sở hữu nó nếu cần thiết (nếu làm như vậy, hãy thử thêm một giao diện khác để định nghĩa các callback, lớp cơ sở sẽ thực hiện nó và lớp con sẽ có nó như kiểu biến thành viên). Sử dụng các cuộc gọi đến lớp thành viên để thực hiện SomeInterface. Bằng cách này, mã được triển khai trong một lớp khác, điều này giúp dễ dàng duy trì, nhưng bạn không thực hiện nhiều thừa kế.
Ý tưởng đằng sau bố cục là động cơ không phải là ô tô mà xe hơi có động cơ. Chiếc xe cần một động cơ, nhưng không cần phải biết làm thế nào một đơn vị toàn bộ động cơ hoạt động, chỉ cần làm thế nào để giao tiếp với nó. Vì vậy, động cơ không nên kế thừa từ xe hơi. Nhưng có chiếc xe thực hiện động cơ là ngớ ngẩn. Vì vậy, chiếc xe được một động cơ như một thành viên của toàn bộ chiếc xe, nhưng như một đối tượng. Chiếc xe có động cơ như là một phần của thành phần của nó. Có vẻ như những gì bạn đang làm là nhiều hành vi, giống như một đối tượng vịt có hành vi quack, nhưng vịt cao su là vịt nhưng không quack nhưng kêu la. Vì vậy, chúng khác với các vật thể vịt trời, nhưng cả hai đều có nhiều tính năng khác của vịt. Vì vậy, bạn muốn có một giao diện quack mà mỗi thực hiện khác nhau. Nhưng nhiều con vịt sẽ quack cho giao diện này, vì vậy bạn không muốn phải viết quack cho mỗi người. Đó là nơi bạn sử dụng bố cục để triển khai giao diện hành vi quack.
Theo như tôi biết VB.net không hỗ trợ đa kế thừa nói chung nhưng bạn có thể đạt được một loại đa kế thừa bằng cách làm việc với giao diện (sử dụng “Dụng cụ” thay vì “Inherits”):
Public Class ClassName
Implements BaseInterface1, BaseInterface2
End Class
Điều đó làm việc tốt cho các lớp học nhưng tôi muốn có một giao diện kế thừa một số giao diện cơ sở. Một cái gì đó như thế:
Public Interface InterfaceName
Implements BaseInterface1, BaseInterface2
End Interface
Nhưng từ khóa "Thực hiện" không được phép cho giao diện (ý nghĩa gì, tất nhiên). Tôi cố gắng để sử dụng một loại lớp trừu tượng mà tôi biết từ Java:
Public MustInherit Class InterfaceName
Implements BaseInterface1, BaseInterface2
End Class
Nhưng bây giờ tôi cần phải thực hiện các phương pháp xác định từ BaseInterface1 và BaseInterface2 trong lớp InterfaceName. Nhưng vì InterfaceName cũng là một giao diện, tôi không muốn phải triển khai các phương thức này trong lớp đó.
Trong C# bạn có thể làm điều đó khá dễ dàng:
public interface InterfaceName: BaseInterface1, BaseInterface2 {}
- 1. Giao diện với nhiều lần thừa kế trong C#
- 2. Không thể truyền một lớp có nhiều thừa kế
- 3. Trang có thể kế thừa nhiều trang chính không? (ASP.NET)
- 4. Nhiều thừa kế trong PHP
- 5. Nhiều thừa kế?
- 6. Trong .Net, có thể sử dụng Response.Write trong một lớp không kế thừa từ System.Web.UI.Page
- 7. Nhiều thừa kế: 2Classes1Method
- 8. Python Nhiều thừa kế
- 9. ruby có hỗ trợ nhiều thừa kế
- 10. Loại bỏ nhiều thừa kế
- 11. Thừa kế nhiều giao diện
- 12. Tôi có thể xác định yêu cầu giao diện/phụ thuộc/kế thừa kế thừa không?
- 13. Virtualenv có thể kế thừa từ chương trình khác không?
- 14. Có thể kế thừa từ MKPolyline
- 15. Java ORM: Nhiều (giao diện) thừa kế
- 16. C#: Thừa kế thừa kế
- 17. Một python @classmethod có thể được kế thừa không?
- 18. Thừa kế thừa kế và thừa kế phương thức
- 19. Loại bỏ một thuộc tính kế thừa trong .net
- 20. Các lược đồ XML có nhiều thừa kế
- 21. protobuf có thừa kế?
- 22. C++ nhiều thứ tự thừa kế
- 23. C++ Nhiều kế thừa với giao diện?
- 24. C++ Nhiều câu hỏi thừa kế
- 25. Thừa kế tài liệu trong kế thừa lớp Python
- 26. Có thể khai báo hằng số động trong VB .NET không?
- 27. Sử dụng enable_shared_from_this với nhiều thừa kế
- 28. C# .NET - Làm thế nào tôi có thể lấy typeof() để làm việc với thừa kế?
- 29. Trường tĩnh có được kế thừa không?
- 30. Trong sqlalchemy, làm thế nào tôi có thể sử dụng thừa kế bảng đa hình thừa kế khi bảng con có nhiều khóa nước ngoài vào bảng cha?
Kế thừa một giao diện là không thực sự thừa kế dù ... –
@Orion Edwards: thế nào là nó không? Thừa kế xác định "là một" mối quan hệ, và giao diện là một cách để xác định những gì một đối tượng 'là'. Nếu tôi kế thừa ISerializable, tôi đang nói "Tôi là một ISerializable", và đối xử với tôi như là một tác phẩm ISerializable như mong đợi. –
Hơn nữa để bình luận của @Harper Shelby, một ứng dụng tự nguyện của loại hạn chế này thường được xem là một thực hành tốt nhất trong C++ (thay vì giao diện bạn có lớp cơ sở trừu tượng thuần túy). – Richard