Các lớp một phần trong các dll riêng biệt


154

Có thể có hai phần (cùng một không gian tên, cùng một tên lớp) cho một lớp một phần trong các DLL riêng biệt không?


Giống như những người khác nói rằng điều đó là không thể, nhưng có nhiều cách để bổ sung các lớp với hành vi mới từ các nguồn khác nhau, chính xác thì bạn muốn làm gì trong các dll khác nhau?
Ozan

Trong trường hợp của tôi, tôi muốn thêm một vài phương thức tĩnh vào một lớp được xác định trong thư viện của bên thứ 3. Các phương thức mở rộng sẽ không hoạt động và cả giao diện và kế thừa, vì lớp này là tĩnh. Sau khi phát hiện ra rằng bạn có thể có các lớp tĩnh một phần, tôi đã đến đây để tìm hiểu xem nó có hoạt động trên các hội đồng không, nhưng có vẻ như điều này cũng không hoạt động.
Ben

Câu trả lời:


232

Từ MSDN - Các lớp học và phương pháp :

Tất cả các định nghĩa kiểu một phần có nghĩa là các phần của cùng loại phải được xác định trong cùng một cụm và cùng một mô-đun (tệp .exe hoặc.). Định nghĩa một phần không thể mở rộng nhiều mô-đun.


36

Không. Các lớp một phần là một tính năng ngôn ngữ thuần túy. Khi một tập hợp được biên dịch, các tập tin được kết hợp để tạo ra loại. Không thể truyền bá các tệp thành các cụm khác nhau.

Tuy nhiên, tùy thuộc vào những gì bạn muốn làm, bạn có thể sử dụng các phương thức mở rộng để thực hiện những gì bạn cần.


13

Không, no không thể. Khi lắp ráp được biên dịch, lớp cần phải được hoàn thành.


8

Trong khi các câu trả lời khác cung cấp "Không" khó chịu mà bất kỳ ai hạ cánh trên trang này đều không muốn nhìn thấy hoặc nghe thấy, tôi đã bị bất ngờ bởi một suy nghĩ khác chưa được đề cập ở đây. Nếu các lớp một phần được cho phép trên các hội đồng, người ta sẽ có quyền truy cập vào các thành viên riêng của các loại hiện có không phải do anh ta viết, do đó cho phép anh ta thao túng chúng theo cách mà tác giả ban đầu không có ý định, do đó gây nguy hiểm cho chức năng của tất cả các lớp kế thừa quá.

Không chỉ vậy, những lớp học trong các hội đồng khác (và con cái của họ) sẽ cần phải được biên dịch lại để làm cho nó hoạt động. Do đó, về mặt logic, không thể cho phép chia một lớp trên các hội đồng khác nhau.


Người ta có thể dễ dàng gây rối với các thành viên tư nhân thông qua sự phản ánh nếu thực sự cần thiết. Không thể phân chia một lớp giữa các hội đồng vì các tham chiếu vòng tròn không được phép và chúng sẽ cần thiết để các phần khác nhau của lớp tương tác.
Zar Shardan

6

Bạn có thể sử dụng các phương thức mở rộng khi bạn muốn thêm một phương thức vào một lớp trong một dll khác. Một nhược điểm của phương pháp này là bạn không thể thêm các phương thức tĩnh.


3

Câu hỏi là tại sao bạn muốn tạo một lớp một phần trong một hội đồng khác? Bạn có thể định nghĩa các lớp và giao diện trừu tượng trên các cụm, có thể bạn cần xem xét điều đó.


10
IMHO có các trường hợp hợp lệ, ví dụ: Bạn có thể muốn thêm các chú thích biểu mẫu MVC vào một lớp mô hình được xác định trong một cụm khác. Bản thân hội đồng không biết nó được sử dụng trong bối cảnh nào, vì vậy lớp trong hội đồng không nên có bất kỳ chú thích nào. Chúng có thể được thêm vào một lớp một phần trong bối cảnh MVC (nếu có thể).
nyi

3
nyi, tại sao không chỉ kế thừa từ lớp đó và khai báo các thuộc tính của bạn trên đầu trang? Bạn thậm chí có thể gọi nó cùng tên, nếu bạn thích.
Gleno

0

Bạn có thể chỉ muốn tạo một lớp Wrapper trong thư viện của riêng bạn, xung quanh lớp trong thư viện phần 3. Sau đó thêm bất cứ chức năng nào vào lớp bao bọc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.