1 / 1 / 0
Регистрация: 03.01.2010
Сообщений: 27
1
.NET 4.x

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

23.04.2015, 13:13. Показов 6100. Ответов 1
Метки нет (Все метки)

Привет всем. Ни как не могу понять как позволить базовому классу вызвать метод дочернего. Например:
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
30
31
32
33
34
35
36
37
38
39
40
Class MyObjects //Родитель
{
     string Name;
}
 
Class Child1 : MyObjects
{
     public Child1()
    {
         Name = "child1";
         Collection.mol.Add(this);
    }
    public void method()
    {
         //Какие то действия.
    }
}
 
Class Child2 : MyObjects
{
     public Child2()
    {
         Name = "child2"; 
         Collection.mol.Add(this);
    }
    public void method()
    {
         //Какие то действия.
    }
}
 
Class Collection
{
     public static List<MyObjects> mol = new List<MyObjects>;
     public static void Run() //Этот метод вызывается из основной программы 
     {
           if(mol[0].Name == "Child1")
                 mol[0].method(); // тут я должен вызвать метод дочернего класса
     }
}
Вообщем у меня есть список в котором хранятся ВСЕ объекты любого класса, главное чтоб они были производными от MyObjects.
Затем мне нужно обратиться к экземпляру определенному подкласса(каждый раз это может быть разный подкласс) через базовый класс.
Как это можно реализовать не создавая списки для каждого дочернего класса по отдельности?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2015, 13:13
Ответы с готовыми решениями:

Вызов переопределенного метода класса наследника из базового класса
Предположим есть два класа: public class A { /* ... некая...

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

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

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

1
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
23.04.2015, 13:34 2
toha, если метод method должен быть определен у каждого наследника, то перенесите его в базовый класс и пометьте как virtual (или abstract, если каждый наследник обязан предоставлять свою реализацию).
В каждом дочернем классе переопределяйте реализацию через override:
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
30
31
abstract Class MyObjects //Родитель
{
     string Name;
     public abstract void method();
}
 
Class Child1 : MyObjects
{
     public Child1()
    {
         Name = "child1";
         Collection.mol.Add(this);
    }
    public override void method()
    {
         //Какие то действия.
    }
}
 
Class Child2 : MyObjects
{
     public Child2()
    {
         Name = "child2"; 
         Collection.mol.Add(this);
    }
    public override void method()
    {
         //Какие то действия.
    }
}
Если метод может у каких-то наследников быть, а у каких-то не быть, то варианта 2:
1. Если имеется целая "ветвь" наследников, у которых этот метод должен быть, то определяйте еще один абстрактный класс, наследующийся от базового, в нем определяйте этот метод и в наследниках уже делайте конкретную реализацию.
Потому при вызове можно просто проверить принадлежность каждого наследника к этому типу и вызывать через каст:
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
30
31
32
33
34
35
36
Class MyObjects //Родитель
{
     string Name;
}
 
abstract class MyObjectsWithMethod : MyObjects
{
   public abstract void method();
}
 
Class Child1 : MyObjects
{
     public Child1()
    {
         Name = "child1";
         Collection.mol.Add(this);
    }
}
 
Class Child2 : MyObjectsWithMethod 
{
     public Child2()
    {
         Name = "child2"; 
         Collection.mol.Add(this);
    }
    public override void method()
    {
         //Какие то действия.
    }
}
 
if(mol[0] is MyObjectsWithMethod)
{
                 ((MyObjectsWithMethod)mol[0]).method(); // тут я должен вызвать метод дочернего класса
}
2. Если метод может быть разбросан по иерархии как попало, то определяйте интерфейс и реализуйте его в нужных классах:
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
30
31
32
33
34
35
36
interface IMethodProvider
{
   void method();
}
 
Class MyObjects //Родитель
{
     string Name;
}
 
Class Child1 : MyObjects
{
     public Child1()
    {
         Name = "child1";
         Collection.mol.Add(this);
    }
}
 
Class Child2 : MyObjects, IMethodProvider
{
     public Child2()
    {
         Name = "child2"; 
         Collection.mol.Add(this);
    }
    public void method()
    {
         //Какие то действия.
    }
}
 
if(mol[0] is IMethodProvider)
{
                 ((IMethodProvider)mol[0]).method(); // тут я должен вызвать метод дочернего класса
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2015, 13:34

Вызов метода из другого класса
Вопрос наверняка не сложный для тех, кто понимает ООП. Я пока не силен в этом, поэтому спрошу...

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

Вызов базового конструктора с параметрами из дочернего класса
Всем привет. Есть базовый класс, у которого есть конструктор с параметром. Создал дочерний класс...

Вызов метода базового класса
public class BaseClass { public virtual void Foo() { Console.WriteLine (&quot;BaseClass.Foo&quot;); } }...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.