Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
Qt_user
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 10
1

Как правильно использовать механизмы наследования и полиморфизма для создания единого интерфейса

19.10.2014, 18:23. Просмотров 460. Ответов 4
Метки нет (Все метки)

Доброго времени суток Комрады!
Я невкурю тему про полиморфную обработку или как кошерно_правильно и рассово_верно использовать механизмы наследования и полиморфизма для создания единого интерфейса который позволил бы удобно работать с наследниками базового класса, Например:

Нам нужно запихнуть в контейнер разношёрстные производные классы находящиеся на разных уровнях иерархии \ ветках наследования, но все имеющие базового предка абстрактного класса Animals и проходя циклом по контейнеру(изначально созданному под Animals ) выяснять есть ли у такого то производного от него класса такой то метод и вызывать его, если нету то переходить на следующий элемент в контейнере...
Разъясните пожалуйста как это реализовать на шарпах?!

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
abstract class Animals
{
   protected int health;
   public abstract  void Eat();
}
 
class Mammals : Animals
{
    public override Eat()
    {
         health++;
     }
 
}
 
class Wolf : Mammals
{}
 
//Предположим что все травоядные ( Herbivorous ) умеют прыгать тогда у всех потомков травоядных должен быть   
// метод Jump()
class Herbivorous : Animals
{
     protected int Y;
 
     public override Eat()
    {
         health++;
     }
//Тут мы добавляем метод которого НЕТ в Animals, но нам нужно в коллекции Animals 
//такой как List<Animals> animals = new List<Animals>(); вызывать этот метод если наследники ЭТОГО класса
//присутствуют в коллекции animals как это сделать?
    public void Jump()
    {
        Y++;
    }
     
}
 
class Rabbit : Herbivorous
{
    public override void Jump()
    {
        Y += 5;
    }
}
 
//Создаём коллекцию всех животных и добавляем в неё разношёрстных животных находящихся на разных уровнях
//наследования от Animals 
List<Animals> animals = new List<Animals>();
animals.Add(Wolf);
animals.Add(Rabbit);
 
//ГЛАВНЫЙ ВОПРОС ЗАКЛЮЧАЕТСЯ В ТОМ, что как в цикле foreach пройтись по всей коллекции животных
// и если это класс волка вызвать Eat(), а если класс кролика то вызвать Jump ?!
foreach (Animals A in animals) 
{
   //??????
   A.Eat();
  // или
  //?????
  A.Jump();
 
}
// P.S Иерархию классов менять нельзя!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2014, 18:23
Ответы с готовыми решениями:

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций?
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с...

Есть ли механизмы наследования в C++ как в Delphi?
Приветствую. Я Delphi'ст. И интересует следующий вопрос. А именно в чём различие методов классов...

Объединение нескольких баз для создания единого отчета
Делаю подведение итогов. Есть 5 человек, каждый высылает мне данные, я их объединяю. Хочу чтобы это...

Инсталлятор для создания единого ехе с выбранными пользователем файлами?
решил написать инсталлятор я открытым кодом чтобы был бесплатным.Отсюда вопрос:ну создам...

Принципы наследования и полиморфизма
Даны натуральное число n, действительные числа a1 a2,...,an. Если последовательность a1 ,a2...

4
StudAssistant
Эксперт
9811 / 7003 / 2319
Регистрация: 17.04.2006
Сообщений: 9,622
19.10.2014, 18:23
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
4
ExcellencE
20 / 20 / 16
Регистрация: 22.08.2011
Сообщений: 79
19.10.2014, 18:51 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
 
            //Создаём коллекцию всех животных и добавляем в неё разношёрстных животных находящихся на разных уровнях
            //наследования от Animals 
            List<Animals> animals = new List<Animals>();
            animals.Add(new Wolf());
            animals.Add(new Rabbit());
 
            //ГЛАВНЫЙ ВОПРОС ЗАКЛЮЧАЕТСЯ В ТОМ, что как в цикле foreach пройтись по всей коллекции животных
            // и если это класс волка вызвать Eat(), а если класс кролика то вызвать Jump ?!
            foreach (Animals A in animals) 
            {
               //??????
               A.Eat();
              // или
               if (A is Herbivorous)
                   (A as Herbivorous).Jump();
 
            }
            // P.S Иерархию классов менять нельзя!
        }
    }
 
abstract class Animals
{
   protected int health;
   public abstract  void Eat();
}
 
class Mammals : Animals
{
    public override void Eat()
    {
         health++;
     }
 
}
 
class Wolf : Mammals
{}
 
//Предположим что все травоядные ( Herbivorous ) умеют прыгать тогда у всех потомков травоядных должен быть   
// метод Jump()
class Herbivorous : Animals
{
     protected int Y;
 
     public override void Eat()
    {
         health++;
     }
//Тут мы добавляем метод которого НЕТ в Animals, но нам нужно в коллекции Animals 
//такой как List<Animals> animals = new List<Animals>(); вызывать этот метод если наследники ЭТОГО класса
//присутствуют в коллекции animals как это сделать?
    public virtual void Jump()
    {
        Y++;
    }
     
}
 
class Rabbit : Herbivorous
{
    public override void Jump()
    {
        Y += 5;
    }
}
 
}
1
Qt_user
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 10
19.10.2014, 20:20  [ТС] 3
Большое вам спасибо! Заработало!
Скажите пожалуйста я правильно понимаю, что строка
C#
1
 if (A is Herbivorous)
выясняет тип объекта?
а
C#
1
(A as Herbivorous).Jump();
это явное приведение типа?
или как? Пожалуйста распишите подробней если я неправильно вас понял.
А так же хотелось бы узнать то что я вот как делаю через foreach это хороший подход? или можно сделать как то красивее когда в коллекции существуют совершенно разные объекты одного глобального базового класса и нужно работать с объектом в зависимости от его типа?
правилен ли этот подход? так сказать не наплодил ли я лишних сущьностей?
0
insite2012
Модератор
Эксперт .NET
4890 / 3842 / 1097
Регистрация: 12.10.2013
Сообщений: 11,101
Записей в блоге: 2
19.10.2014, 20:32 4
Qt_user, понимаете верно.
Цитата Сообщение от Qt_user Посмотреть сообщение
как делаю через foreach это хороший подход?
Нормальный подход.
0
ExcellencE
20 / 20 / 16
Регистрация: 22.08.2011
Сообщений: 79
19.10.2014, 20:34 5
Qt_user, вы всё правильно поняли
0
19.10.2014, 20:34
StackOverflow
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2014, 20:34

Понятия инкапсуляции, полиморфизма и наследования
Всем привет. Прошу прояснить для себя 3 основных свойства парадигмы ООП инкапсуляцию, наследования...

Нужны примеры инкапсуляции, полиморфизма и наследования
Добрый вечер. Суть проблемы вот в чем, нужны примеры инкапсуляции, полиморфизма и наследования....

Код с использованием Наследования,Инкапсуляции,Полиморфизма
Кому не сложно,напишите код с использованием Наследования,Инкапсуляции,Полиморфизма Самый простой...


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

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

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