2010-02-15 41 views
16

Tôi hiện đang có một giải pháp với nhiều dự án chủ yếu sử dụng cùng một lớp. Kết quả là, nó xuất hiện với tôi rằng nó sẽ là một ý tưởng tốt để thêm một thư viện lớp có chứa các lớp này trong giải pháp thay vì lặp lại lớp trong mỗi dự án.C# Các lớp học một phần

Tuy nhiên, một dự án tôi yêu cầu một vài thuộc tính bổ sung cho một số lớp học cụ thể cho dự án đó và sẽ không được sử dụng ở bất kỳ nơi nào khác. Kết quả là, tôi nghĩ rằng tôi nên sử dụng các lớp học một phần để thêm các thuộc tính này. Vì vậy, tôi đã làm một cái gì đó như thế này:

Trong thư viện lớp:

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string Title { get; set; } 
     public string AuthorLast { get; set; } 
     public string AuthorFirst { get; set; } 
     public string Publisher { get; set; } 
     public string Edition { get; set; } 
     public string ISBN10 { get; set; } 
     public string ISBN13 { get; set; } 
    } 
} 

Trong dự án (MyProject):

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string AdditionalProperty { get; set; } 
    } 
} 

Tôi đã tham chiếu MyClassLibrary trong MyProject (C# cửa sổ hình ứng dụng), tuy nhiên khi tôi cố gắng sử dụng lớp này trong codebehind cho biểu mẫu tôi nhận được lỗi sau:

class MyClassLibrary.Book

Warning: The type 'MyClassLibrary.Book' in 'C:... (Project)' conflicts with the imported type 'MyClassLibrary.Book' in 'C:... (Class Library DLL)'. Using the type defined in 'C:...(project)'.

Bất kỳ ý tưởng nào tôi đang làm sai hoặc nếu toàn bộ cách tiếp cận của tôi là xấu và tôi nên làm điều gì đó khác?

Trả lời

20

Partials không cho kéo dài hội. Nếu bạn cần thêm vào lớp học của bạn cho một loại cụ thể hơn về việc sử dụng, bạn nên tạo một lớp có nguồn gốc:

public class MyFoo 
{ 
    public string BasicProperty {get;set;} 
} 

public class MySpecificFoo : MyFoo 
{ 
    public string AnotherProperty {get;set;} 
} 

Trong dự án của bạn yêu cầu loại cụ thể hơn về MyFoo, sử dụng MySpecificFoo để thay thế. Kể từ khi nó kế thừa/xuất phát từ MyFoo, nó sẽ có tất cả các thuộc tính và chức năng của MyFoo, với các thuộc tính bổ sung là tốt. Đây là một phần của Polymorphism, đó là nơi sức mạnh thực sự của OOP nằm.

+0

cảm ơn! Tôi sẽ thử nó với một lớp học có nguồn gốc ... vẫn còn mới ở đây! – Andrew

+2

uh ... không, đây được gọi là "kế thừa"! –

+0

@Steven chỉnh sửa cho rõ ràng –

9

Tóm lại, bạn không thể sử dụng các lớp học một phần qua các dự án. Tất cả các nguồn phải được biên dịch cùng một lúc, và điều đó được thực hiện cho mỗi dự án.

Dưới đây là một cuộc thảo luận đầy đủ về SO về điều này: Should you use a partial class across projects?

+0

Cảm ơn câu trả lời nhanh. Bạn có bất kỳ ý tưởng làm thế nào tôi có thể tổ chức tốt nhất các lớp học sau đó đưa ra vấn đề này? Tôi có nên sao chép chúng trong các dự án hay chỉ thêm thuộc tính vào lớp trong thư viện lớp mặc dù nó chỉ cho một dự án? Chỉnh sửa: tôi sẽ thử các lớp học có nguồn gốc như được đề xuất bên dưới. Cảm ơn một lần nữa – Andrew

+1

Tôi sẽ đi với câu trả lời của Rex cho một giải pháp, kế thừa các lớp học có vẻ như cách tiếp cận tốt nhất ... trừ khi có một lý do bạn không thể, nếu vậy, những hạn chế bổ sung là có? –

+0

Từ [Skeet trên câu hỏi được liên kết đó] (http://stackoverflow.com/a/309944/1028230): 'Bạn không thể viết một phần lớp trên các dự án. Một phần lớp là một đoạn biên dịch chỉ có thời gian biên dịch - toàn bộ loại kết thúc trong một hội đồng duy nhất, tức là một dự án.' – ruffin

1

Đối với những gì bạn đang cố gắng làm, bạn nên cố gắng sử dụng các lớp cơ sở và kế thừa. Hoặc thậm chí tốt hơn object composition.

+0

từ mô tả ngay lập tức, bố cục chắc chắn không phải là giải pháp tốt hơn –

+0

@Steven Tuyệt đối. Tôi chỉ thấy rằng nó là hữu ích để chỉ ra bởi vì nhiều người mới tìm hiểu về thừa kế và sau đó nhận được mình gặp rắc rối bằng cách sử dụng nó ** ở khắp mọi nơi ** đơn giản chỉ vì họ không biết bất kỳ tốt hơn. –

0

Tôi nghĩ điều này phù hợp hơn với những gì bạn đang cố gắng đạt được.

Đặt tất cả các lớp phổ biến của bạn vào một dự án thư viện lớp và biên dịch nó thành một DLL.

Sau đó, bạn có thể tham chiếu DLL đó trong các dự án bên ngoài. Bất cứ lúc nào bạn cần thêm thuộc tính vào nó cho dự án bên ngoài, bạn có thể kế thừa lớp và thêm thuộc tính ở đó.

0

tất cả đều sai. Bạn nên xem xét một phần phương pháp thay thế. Nhìn lên. Chúng chính xác là những gì bạn yêu cầu.

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