Вызовите родительский метод из дочернего класса С#

Это немного другой вопрос из предыдущих ответов, которые я видел, или я не получаю его. У меня есть родительский класс с методом с именем MyMethod() и переменной public Int32 CurrentRow;

public void MyMethod()
{    
     this.UpdateProgressBar();    
}

В родительском я создаю новый экземпляр ChildClass

Boolean loadData = true;
if (loadData) 
{    
     ChildClass childClass = new ChildClass();    
     childClass.LoadData(this.Datatable);    
}

В методе дочернего класса LoadData() я хочу иметь возможность установить переменную CurrentRow родителя и вызвать функцию MyMethod().

Как это сделать?

Ответы

Ответ 1

Найден решение.

В родительском объявлении я объявляю новый экземпляр ChildClass(), а затем привязываю обработчик события в этом классе к локальному методу в родительском

В дочернем классе я добавляю открытый обработчик событий:

public EventHandler UpdateProgress;

В родительском я создаю новый экземпляр этого дочернего класса, затем привязываю локальное родительское событие к public eventhandler в дочернем

ChildClass child = new ChildClass();
child.UpdateProgress += this.MyMethod;
child.LoadData(this.MyDataTable);

Затем в LoadData() дочернего класса я могу вызвать

private LoadData() {
    this.OnMyMethod();
}

Где OnMyMethod:

public void OnMyMethod()
{
     // has the event handler been assigned?
     if (this.UpdateProgress!= null)
     {
         // raise the event
         this.UpdateProgress(this, new EventArgs());
     }
}

Это запускает событие в родительском классе

Ответ 2

Для доступа к свойствам и методам родительского класса используйте ключевое слово base. Итак, в вашем методе child LoadData() вы сделаете следующее:

public class Child : Parent 
{
    public void LoadData() 
    {
        base.MyMethod(); // call method of parent class
        base.CurrentRow = 1; // set property of parent class
        // other stuff...
    }
}

Обратите внимание, что вам также нужно будет изменить модификатор доступа вашего родителя MyMethod(), по крайней мере, на protected, чтобы дочерний класс получил к нему доступ.

Ответ 3

Один из способов сделать это - передать экземпляр ParentClass в ChildClass при построении

public ChildClass
{
    private ParentClass parent;

    public ChildClass(ParentClass parent)
    {
        this.parent = parent;
    }

    public void LoadData(DateTable dt)
    {
       // do something
       parent.CurrentRow++; // or whatever.
       parent.UpdateProgressBar(); // Call the method
    }
}

Обязательно передайте ссылку на this при построении ChildClass внутри родителя:

if(loadData){

     ChildClass childClass = new ChildClass(this); // here

     childClass.LoadData(this.Datatable);

}

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

EDIT. В комментариях вы упомянули, что более 1 родительский класс хочет использовать ChildClass. Это возможно с введением интерфейса, например:

public interface IParentClass
{
    void UpdateProgressBar();
    int CurrentRow{get; set;}
}

Теперь убедитесь, что реализовали этот интерфейс для обоих (всех?) родительских классов и изменили класс child на это:

public ChildClass
{
    private IParentClass parent;

    public ChildClass(IParentClass parent)
    {
        this.parent = parent;
    }

    public void LoadData(DateTable dt)
    {
       // do something
       parent.CurrentRow++; // or whatever.
       parent.UpdateProgressBar(); // Call the method
    }
}

Теперь все, что реализует IParentClass, может построить экземпляр ChildClass и передать this его конструктору.

Ответ 4

Следить за комментарием сухендри к Рори МакКросану. Вот пример делегата Action:

В дочернем добавить:

public Action UpdateProgress;  // In place of event handler declaration
                               // declare an Action delegate
.
.
.
private LoadData() {
    this.UpdateProgress();    // call to Action delegate - MyMethod in
                              // parent
}

В родительском добавить:

// The 3 lines in the parent becomes:
ChildClass child = new ChildClass();
child.UpdateProgress = this.MyMethod;  // assigns MyMethod to child delegate