2010-06-16 8 views
5

mam niektóre klasy dziedziczą z kontroli istniejących okien jak TextBox i DateTimePicker, ..etcJaka jest najlepsza praktyka dla alternatywnego rozwiązania wielo-dziedziczenia w C#

Chcę dodać niestandardowe funkcje do tych klas, takich jak (czytaj, Alert, ... itd) te dodatkowe funkcje są takie same we wszystkich tych klas

problemem jest: te klasy odziedziczone różnicowych rodziców, więc nie mogę umieścić moje dodatkowych funkcji w klasie dominującej,

Jaka jest najlepsza praktyka w tym przypadku:

  • powtarzania kodu w każdym dziedziczona klasy

  • użyć oddzieloną klasy mają funkcji jako statyczne Methods z parametrem z interfejsu realizacji tego interfejsu dla klas i następnie przekazują je.

  • Zastosowanie wydzieloną klasy jak drugim podejściu ale dynamiczny parametr (który dodaje się w C# 4.0)

    lub innego !!

góry dzięki

Odpowiedz

12

Rozważałbym opcję 4: skład.

Najpierw określ swój zestaw funkcji. Zakładamy, że twoja lista częściowa jest wyłączna, więc "Odczyt" i "Alert".

Po drugie, utwórz pojedynczą klasę, która implementuje tę funkcję, podobnie jak MyCommonControlBehaviors. Wolałbym, aby ta implementacja nie była statyczna, jeśli to możliwe, ale może być ogólna.

public MyCommonControlBehaviors 
{ 
    public Whatever Read() { /* ... */ } 
    public void Alert() {} 
} 

trzecie, kompozycja użycie dodać instancję tej klasy do każdego z rodzajów kontroli celnych i odsłonić tę funkcjonalność poprzez kontrolą niestandardowe:

public class MyCustomControl 
{ 
    private MyCommonControlBehaviors common; // Composition 

    public Whatever Read() { return this.common.Read(); } 
    public void Alert() { this.common.Alert(); } 
} 

zależności od specyfiki można ruszyć do stopień konieczny. Np. Być może Twoje niestandardowe zachowania wymagają interakcji z prywatnymi danymi kontrolnymi. W takim przypadku spraw, aby sterowanie wdrożyło wspólny interfejs ICommonBehaviorHost wymagany przez typowe zachowania.Następnie przekazać kontrolę do klasy zachowanie na budowie jako przykład ICommonBehaviorHost:

public interface ICommonBehaviorHost 
{ 
    void Notify(); 
} 

public class MyCommonControlBehaviors 
{ 
    ICommonBehaviorHost hst = null; 

    public MyCommonControlBehaviors(ICommonBehaviorHost host) 
    { 
     this.hst = host; 
    } 

    public void Alert() { this.hst.Notify(); } // Calls back into the hosting control 
    // ... 
} 

public class MyCustomControl : ICommonBehaviorHost 
{ 
    private MyCommonControlBehaviors common = null; 

    public MyCustomControl() { common = new MyCommonControlBehaviors(this); } 
    public Whatever Read() { return this.common.Read(); } 
    public void Alert() { this.common.Alert(); } 

    void ICommonBehaviorHost.Notify() { /* called by this.common */ } 
} 
+4

i połącz go z wtryskiem zależności, aby zminimalizować sprzężenie systemu ... –

+0

+1 @ marc_s dla prawdy. Istnieje wiele dodatkowych technik, które można wykorzystać w celu zminimalizowania sprzężeń i dodania możliwości tego podejścia. Jedną z rzeczy, które robiłem w przeszłości, jest generowanie 'MyCommonControlBehaviors', aby mogło zwrócić' MyCustomControl', cokolwiek to jest. (W tym przykładzie nie ma to większego sensu, ale w domenie, z którą pracowałem, miało to sens). –

1

Jeśli musisz, to co prawdopodobnie zrobiłbym, to stworzyć metody rozszerzenia dla każdej klasy, a następnie odnieść się do rzeczywistego kodowania potrzebnego do tego w jakimś innym obiekcie, do którego mogą się odwoływać wszystkie metody rozszerzenia.

W ten sposób kod nie jest duplikowany, a metody rozszerzeń sprawiają, że wygląda tak, jak powinny być metody w obiekcie.

To samo zasadniczo poprzez stworzenie metody statycznej i robi: Functions.DoSomething(my_Object);

Ale ja zawsze lubię: my_Object.DoSomething() lepiej w języku obiektowym.

0

Proponuję definiowania interfejs dla zachowań, a następnie (żeby nie powtarzać siebie) tworzą metody rozszerzenie na tej definicji interfejsu dla Twoje wspólne metody. (Trochę jak twoja druga opcja, tylko z metodami rozszerzenia zamiast całkowicie statycznych metod).

Powiązane problemy