2014-09-27 4 views
1

У меня есть эта небольшая проблема с дизайном, на которой я хочу найти оптимальное решение.Разработка класса с использованием общего метода для разных подклассов

У меня есть родительский класс A и с объектами других классов, скажем, класс B, C..etc. У меня есть 6 из этих дочерних классов.

Теперь каждый дочерний класс должен вызвать некоторый метод из родительского класса. Обычный метод вызывает некоторый делегат, который представляет собой отправку событий из родительского класса.

Так структура:

class ParentA 
{ 
    Child B, C, D, E, F, G; 

    CommonMethod() 
    { 
     //Common task 
     CallDelegate(); 
    } 
} 

В настоящее время решение передается объект родительского класса для всех классов по 6 детей. Через которые дочерние классы получают доступ к общему методу.

Мне было интересно, есть ли лучший способ выполнить эту работу.

Для примера. делая commonMethod статичным там, потому что мне не нужно передавать родительский рефренс каждому дочернему классу. Кроме того, я не хочу публиковать CommonMethod.

Пожалуйста, предложите лучший подход или дайте мне знать, если текущая реализация будет достаточно хорошей.

+0

Эти дочерние классы наследуются от родителя? –

+0

Нет, они не присущи родительскому классу. Думаю, «ребенок» может быть немного запутанным. – user2692032

+0

Ваш обычный метод всегда будет общедоступным, иначе вы не сможете получить к нему доступ с помощью объекта. –

ответ

2

Вы можете передать метод как delegate дочерним классам, а не всему классу ParentA. Таким образом, Child должен быть предоставлен только тот метод, который он хочет запустить, и это все, что ему нужно.

public class ParentA 
{ 
    Child B, C, D, E, F, G; 

    public void Setup() 
    { 
     // pass CommonMethod or even just CallDelegate to the child classes 
     B.SetParentMethod(this.CommonMethod); 
     C.SetParentMethod(this.CommonMethod); 
     D.SetParentMethod(this.CommonMethod); 
     E.SetParentMethod(this.CommonMethod); 
     F.SetParentMethod(this.CommonMethod); 
     G.SetParentMethod(this.CommonMethod); 
    } 

    private void CommonMethod() 
    { 
     //Common task 
     CallDelegate(); 
    } 
} 

public class Child 
{ 
    private Action parentMethod; 

    public void SetParentMethod(Action parentMethod) 
    { 
     this.parentMethod = parentMethod; 
    } 

    public void DoSomeAction() 
    { 
     // call the common task 
     this.parentMethod(); 
    } 
} 
1

В основном, эквивалент решения Rhumbori, но с использованием событий. Любой может быть приемлемым или предпочтительным для другого в зависимости от ваших неустановленных требований. События налагают некоторые требования к вашим подписям метода и могут быть неприемлемыми.

class A { 
    B x, y, z; 

    void Init() { 
     x.Something += Common; 
     y.Something += Common; 
     z.Something += Common; 
    } 

    void Common(object sender, EventArgs e) { 

    } 
} 

class B { 
    public event EventHandler Something; 

    public void OnSomething() { 
     if (Something != null) 
      Something(this, EventArgs.Empty); 
    } 
}