Вызов метода из дочернего класса - PullRequest
1 голос
/ 27 января 2010

В Silverlight / C # у меня есть класс Main, который создает экземпляр Child, Child _child = new Child (...)

Теперь в дочернем классе мне нужно вызвать метод из основного класса. Какой должен быть лучший способ сделать это? События

Ответы [ 3 ]

7 голосов
/ 27 января 2010

Простейшим решением будет предоставить ссылку на Main на экземпляр класса Child:

public class Child
{
    private Main main;

    public Child(Main main)
    {
        this.main = main;

        main.Bar();
    }
}

public class Main
{
    public void Foo()
    {
        Child c = new Child(this);
    }

    public void Bar()
    {
    }
}

Это можно еще улучшить, абстрагировав класс Main за интерфейсом IMain, чтобы свести к минимуму связь.

Но лучшим решением будет использование всплывающих событий

4 голосов
/ 27 января 2010

Ответ зависит от семантики вызова; Ваш пример расплывчат и не имеет очевидной семантики, из-за чего невозможно дать хороший ответ.

Предоставляет ли Main услугу Ребенку? Например, является ли звонок, который Child хочет сделать на Main, чем-то вроде «получить мне список пользователей, которым разрешено делать бла», или «сложить все счета к получению за ноябрь»?

Или Main реагирует на событие , связанное с Child? Например, возможно, «Ребенок» - это кнопка, а «Main» - это форма, и «Main» желает реагировать на нажатие кнопки.

В первом случае Main должен предоставить объект - возможно, самого себя - Child, который реализует желаемую службу. Объектом может быть сам Main, или делегат метода, или интерфейс, но это то, что Child может вызывать, когда требуется служба.

В последнем случае Мэйн должен прослушать событие, поднятое Ребенком.

Что является правильным, зависит от значения объектов; Можете ли вы описать смысл более четко?

3 голосов
/ 27 января 2010

Событие - это правильный шаблон. См. этот ответ о концептуальных причинах потока информации в иерархии объектов / классов.

более глубокие компоненты просто «высвобождают» свою информацию - обычно через событие - и она «всплывает» по цепочке без непосредственного вызова

...