2010-02-15 12 views
16

Obecnie mam rozwiązanie z wieloma projektami, które najczęściej korzystają z tych samych klas. W rezultacie okazało się, że dobrym pomysłem byłoby dodanie do rozwiązania biblioteki klas zawierającej te klasy zamiast powtarzania klasy w każdym projekcie.C# Partial Classes

Jednak jeden projekt Mam kilka dodatkowych właściwości do niektórych klas, które są specyficzne dla tego projektu i nie będą używane nigdzie indziej. W rezultacie pomyślałem, że powinienem użyć klas częściowych, aby dodać te właściwości. Więc zrobiłem coś takiego:

W bibliotece klasy:

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; } 
    } 
} 

W ramach projektu (myproject):

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

mam odwoływać MyClassLibrary w MyProject (C# okna formularza aplikacji), jednak gdy spróbuję użyć tej klasy w kodzie dla formularza, otrzymuję następujący błąd:

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)'.

Każdy pomysł, co robię źle lub jeśli całe moje podejście jest złe i powinienem robić coś innego?

Odpowiedz

20

partials nie są dla obejmujące zespoły. Jeśli chcesz dodać do swojej klasy na bardziej konkretnego rodzaju użytkowania, należy utworzyć klasę pochodną:

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

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

w projekcie wymaga bardziej konkretny typ MyFoo, zamiast wykorzystać MySpecificFoo. Ponieważ dziedziczy on/wywodzi się z MyFoo, będzie miał wszystkie właściwości i funkcjonalność MyFoo, z dodatkowymi właściwościami. Jest to część Polymorphism, gdzie znajduje się prawdziwa moc OOP.

+0

dzięki! Spróbuję tego z klasą pochodną ... wciąż nową! – Andrew

+2

uh ... nie, to się nazywa "dziedziczenie"! –

+0

@Steven zredagowany dla jasności –

9

Podsumowując, nie można używać klas częściowych w ramach projektów. Wszystkie źródła muszą być kompilowane w tym samym czasie, i to jest robione na projekt.

Oto pełna dyskusja na ten temat SO: Should you use a partial class across projects?

+0

Dzięki za szybką odpowiedź. Czy masz jakieś pomysły, jak najlepiej zorganizować zajęcia, a następnie podam ten temat? Czy powinienem je po prostu powielić w projektach lub po prostu dodać właściwość do klasy w bibliotece klas, mimo że jest to tylko jeden projekt? Edycja: zamierzam wypróbować klasy pochodne zgodnie z sugestią poniżej. Jeszcze raz dziękuję – Andrew

+1

Chciałbym pójść z odpowiedzią Rexa na rozwiązanie, dziedziczenie klas wydaje się najlepszym podejściem ... chyba że jest jakiś powód, którego nie można, jeśli tak, jakie dodatkowe ograniczenie istnieje? –

+0

Od [Skeet w tym połączonym pytaniu] (http://stackoverflow.com/a/309944/1028230): 'Nie możesz napisać częściowej klasy dla projektów. Klasa częściowa jest komponentowym cukrem składającym się tylko z kompilacji - cały typ kończy się pojedynczym zestawem, tj. Jednym projektem " – ruffin

1

Do tego, co próbujesz zrobić, powinieneś zamiast tego spróbować użyć klas bazowych i dziedziczenia. Lub jeszcze lepiej object composition.

+0

od najbliższego opisu, kompozycja zdecydowanie nie jest lepszym rozwiązaniem –

+0

@Steven Absolutely. Po prostu uważam, że warto zwrócić uwagę, ponieważ wielu nowicjuszy uczy się o dziedziczeniu, a następnie wpada w kłopoty, używając go ** wszędzie ** tylko dlatego, że nie wiedzą nic lepszego. –

0

Myślę, że jest to bardziej zgodne z tym, co próbujesz osiągnąć.

Umieść wszystkie swoje wspólne klasy w projekcie biblioteki klas i skompiluj go do biblioteki DLL.

Możesz następnie odwołać się do tej biblioteki DLL w zewnętrznych projektach. Za każdym razem, gdy musisz dodać do niego właściwość dla projektu zewnętrznego, możesz dziedziczyć klasę i dodać tę właściwość.

0

wszystko źle. Zamiast tego powinieneś rozważyć częściowe metody. Patrz im. Są dokładnie tym, o co prosiłeś.

Powiązane problemy