2011-12-25 26 views
7

Tôi tự hỏi nếu có cách nào để giới hạn những người có thể kế thừa từ một lớp học.Có cách nào để hạn chế ai có thể kế thừa một lớp hoặc giao diện không?

  • internal: không cho phép lớp được thừa hưởng bên ngoài lắp ráp
  • sealed: lớp không thể được thừa hưởng

Có một từ khoá hoặc cách chỉ cho phép các lớp học nhất định (giả sử từ nó chỉ không gian tên riêng) để kế thừa lớp đó?

Ngoài ra, tôi không muốn lớp đặc biệt này là chung chung. Mối quan tâm của tôi không phải là an ninh mà là thiết kế nói chung.

Ví dụ về những gì tôi muốn:

  • lớp A.
  • Class B kế thừa từ A
  • Lớp C không thể kế thừa từ A
+0

Làm cho nội bộ của lớp học không chỉ ngăn các lớp bên ngoài kế thừa mà còn từ việc sử dụng nó.Để ngăn chặn các lớp con bên ngoài, bạn cần các thủ thuật đặc biệt, chẳng hạn như các phương thức 'abstract trừu tượng' và không hoạt động trên các giao diện. – CodesInChaos

+0

Bạn muốn giới hạn loại nào? Bạn có nhìn vào InheritanceDemand không? http://palisade.plynt.com/issues/2006Apr/link-demand/ –

+4

Lưu ý rằng việc hạn chế không gian tên không có nhiều sự bảo vệ, vì một hội đồng giả mạo chỉ có thể nói 'namespace Awesome {public class Stolen: Secret { }} 'và bây giờ họ có thể sử dụng' Awesome.Stolen' để truy cập 'Awesome.Secret'. –

Trả lời

16

Có cách nào để chỉ cho phép một số lớp nhất định kế thừa lớp đó không?

Có. Nếu mã kế thừa được một phần đáng tin cậy sau đó bạn có thể đặt một nhu cầu thừa kế trên lớp cơ sở và thời gian chạy sẽ không cho phép các lớp kế thừa để tải nếu nó không đáp ứng các điều kiện của nhu cầu:

https://msdn.microsoft.com/en-us/library/x4yx82e6(v=vs.100).aspx

Tất nhiên, tin cậy đầy đủ nghĩa là toàn bộ sự tin cậy. Mã hoàn toàn đáng tin cậy có thể thừa hưởng bất cứ điều gì nó muốn.

Tôi nghi ngờ rằng bạn đang cố gắng áp đặt những hạn chế mà bạn thực sự không nên cố gắng áp đặt. Bạn có thể mô tả lý do tại sao bạn đang cố gắng để làm điều này khó khăn? Có lẽ có một cách tốt hơn để làm những gì bạn muốn.

UPDATE:

Tôi đang cố gắng để hạn chế thừa kế trong các lớp học của tôi trong cùng một assembly.

Sau đó, có thể bạn nên nói rằng ngay từ đầu.

Làm cho tất cả các hàm tạo của lớp nội bộ. Để kế thừa từ một lớp, nó phải có một hàm tạo có thể truy cập. Nếu bạn tạo tất cả các hàm tạo bên trong thì chỉ các lớp trong assembly đó mới có thể kế thừa từ lớp cơ sở.

+0

Tuyệt. Mặc dù tôi không thể sử dụng nó vì tôi đang sử dụng .Net 3.5 – Odys

+1

@odyodyodys: Nhu cầu thừa kế được gửi đi với .NET v1. –

8

Theo như tôi biết, sử dụng internal là cách duy nhất để kiểm soát ai có thể kế thừa một lớp học. Nếu người thừa kế phải ở trong một assembly khác, bạn có thể cho phép các lớp từ assembly khác xem nội bộ của assembly bằng cách sử dụng thuộc tính InternalsVisibleTo (assembly đích phải được ký để làm việc với assembly đã được ký).

+1

Câu trả lời hay, nhưng bạn không cần phải ký cho InternalsVisibleTo để làm việc. – Andy

+0

@Andy Cảm ơn bạn đã làm rõ. Tôi quên đề cập đến việc ký chỉ được yêu cầu đối với các hội đồng đã ký. Tôi quyết định đề cập đến việc ký tên ở nơi đầu tiên, bởi vì tôi nhớ những rắc rối tôi đã đi qua để tìm hiểu lý do tại sao tôi không thể kiểm tra các phương pháp nội bộ của hội đồng đã ký của tôi từ hội đồng kiểm tra đơn vị unsigned của tôi. – dasblinkenlight

Các vấn đề liên quan