0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 4
1

Вызов переопределенного метода класса наследника из базового класса

06.05.2013, 23:22. Показов 8801. Ответов 7
Метки нет (Все метки)

Предположим есть два класа:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class A
    {
        /*
         ... некая дополнительная реализация....
         */
 
        protected virtual void OnSelect()
        {
            if (Select != null) Select.Invoke();
        }
 
        public delegate void S();
 
        public event S Select;
    }
 
    public class B : A
    {
        protected override void OnSelect()
        {
            base.OnSelect();
        }
    }
В базовом A классе происходят некие события и в нем вызвается метод OnSelect, как реализовать этот вызовтак, что бы он начался с вызова переопределенного метода в B? Для примера: если создали производный класс MyForm от Form и переопределеили метод OnPain, то при оповщение о перерисковки в начале будет вызван MyForm.OnPaint, потом Form.OnPaint... а далее событие Paint. Как это реализовано?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2013, 23:22
Ответы с готовыми решениями:

Вызов метода дочернего класса из базового
Привет всем. Ни как не могу понять как позволить базовому классу вызвать метод дочернего. Например:...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

В чем причина вызова метода базового класса? (Паттерн Декоратор)
Разбираю пример из книги Фримена "Паттерны проектирования", паттерн Декоратор. Если делать все...

Каким образом можно из метода одного класса, вывести в метод другого класса текст всплывающего сообщения
Доброе время суток! Есть метод отрисовки всплывающего сообщения public void SetBalloonTip()...

7
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.05.2013, 01:37 2
Ну как вы и написали:
C#
1
2
3
4
5
6
7
8
    public class B : A
    {
        protected override void OnSelect()
        {
            OverridedSelect();
            base.OnSelect();
        }
    }
0
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 4
07.05.2013, 13:56  [ТС] 3
Так, это сработает, только если вызвать B.OnSelect(), а вызов надо произвести из A, причем родительсий класс (в момент его написания, и компиляции) не знает о существовании наследника.
0
648 / 582 / 171
Регистрация: 17.07.2012
Сообщений: 1,650
Записей в блоге: 1
07.05.2013, 13:59 4
Как вариант, при помощи рефлексии найти все классы-наследники и вызывать методы.
0
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 4
07.05.2013, 14:09  [ТС] 5
Cupko, в принципе вариант, но может есть более "изящный способ"?

Вот как это реализована для наследников System.Windows.Forms.Control например для Control.OnPaint ? Неужели и там через рефлексию? Это было бы не эффективно?
0
606 / 581 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
07.05.2013, 14:13 6
как вариант:
C#
1
2
3
4
5
6
7
8
9
10
public abstract class A
{
   protected abstract void BSelect();
 
   protected void OnSelect()
   {
      BSelect();
      //if (Select != null) Select.Invoke();
   }
}
но экземпляр A в данном случае создать будет нельзя.
0
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 4
07.05.2013, 14:19  [ТС] 7
Cupko,
Только проверил, сделал в A такой вызов:

C#
1
2
3
4
5
if (this is B)
{
   B b = (B) this;
   b.OnSelect();
}
не сработало, вызов все равно идет через A.OnSelect (((

Добавлено через 3 минуты
Spectral-Owl,

Не вартант, т.к:

наследником А могут быть и класс B2 и т.д. Кроме того может быть наследник у B и т.д.. Т.е. вызов реализованный в базовом классе должен раобтать для всей цепочки наследников вызыватсья метод X.OnSelect у последнего наследника, и через base.OnSelect дойти до A.OnSelect
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.05.2013, 21:00 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class A
{
   protected virtual void Select()
   {}
 
   protected void OnSelect()
   {
      Select();
      //some work here
   }
}
 
class B : A
{
   protected override void Select()
   {
      //Some work here
      base.Select();
   }
}
 
class C : B
{
   protected override void Select()
   {
      //Another here
      base.Select();
   }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2013, 21:00
Помогаю со студенческими работами здесь

Сериализация наследника от шаблонного класса
В общем есть шаблонный класс для сериализации. Есть еще один базовый класс, шаблонный, от которого...

Получение имени класса-наследника
Есть базовый класс, в нём виртуальный метод принимающий некий параметр, у класса много наследников,...

Доступ к методу родительского класса из метода свойства родительского класса
Не знаю правильно ли написал тему, ну суть такая, есть класс который описывает допустим шарик, а...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru