2008-12-08 37 views

Trả lời

16

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ó.

+6

Kế thừa một giao diện là không thực sự thừa kế dù ... –

+0

@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. –

+0

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

4

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.

1

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.

1

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 {} 
Các vấn đề liên quan