Вызовите родительский метод из дочернего класса С#
Это немного другой вопрос из предыдущих ответов, которые я видел, или я не получаю его. У меня есть родительский класс с методом с именем 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