145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
1

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода

30.04.2012, 17:33. Показов 16377. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В базовом классе метод помечен как virtual.
Насколько я понял из книги:
override означает, что метод не утрачивает связи с базовым классом.
New означает полное переопределение метода.

Таким образом, в моем понимании, возможны три варианта:
1. Вызов метода базового класса путем обращения с экземпляром дочернего класса как с экземпляром родительского класса (например, при помещении в массив экземпляров родительского класса).
2. Вызов переопределенного метода (overridden).
3. Вызов нового метода (new).

И надеялся в своем примере получить:
Overridden имя кошки: Murka.
В базовом классе: Baikal
New имя собаки:Baikal

Т.е. в цикле foreach должен у собаки вызваться метод из базового класса (потому что я в этом цикле прогоняю экземпляры класса Animal). А вот когда я конкретно вызываю метод получения имени для класса Dog, то должен сработать новый метод.

Почему в своем примере я получаю результат
Overridden имя кошки: Murka.
В базовом классе: Baikal
В базовом классе: Baikal

?

Заранее спасибо.



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
using System;
class Animal
{
    public Animal(string name)
    {
        this.name = name;
    }
 
    public virtual string getName()
    {
        return "В базовом классе " + name;    
    }                            
 
    private string name;
 
}
 
class Cat : Animal
{
    public Cat(string name) : base(name){}
    public override string getName()
    {
        return "Overridden имя кошки: " + base.getName();
    }
}
 
class Dog : Animal
{
    public Dog(string name) : base(name){}
 
    new string getName()
    {
        return "New имя собаки: " + base.getName();
    }
 
}
 
 
class AnimalTest
{
    public static void Main()
    {
        Animal[] farm = new Animal[2];
      farm[0] = new Cat("Murka");
        farm[1] = new Dog("Baikal");
 
 
        foreach(Animal animal in farm)
        {
            Console.WriteLine(animal.getName());
        }
 
        Console.WriteLine(farm[1].getName());
 
    }
}
Миниатюры
Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2012, 17:33
Ответы с готовыми решениями:

Экземпляры класса, вызов переопределенного метода
как лучше вызвать переопределенный метод? Console.WriteLine(m1.ToString()); или через...

Вызов метода из базового класса
привет! не могу понять, не доходит, как в c# сделать так чтобы из производного класса вызвать...

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

Вызов метода наследика с базового класса
Здравствуйте. Подскажите, как в базовом классе можно вызвать метод наследника, который не...

3
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
30.04.2012, 19:11 2
Потому что вы сами ответили на свой вопрос:
Цитата Сообщение от Kifsif Посмотреть сообщение
New означает полное переопределение метода.
То есть метод, определенный как new, может быть использован только в том случае, когда он вызывается по ссылке на класс, его определивший. В противном случае будет вызван родительский метод, что у вас и происходит.

На всякий случай: "new" с английского переводится как "новый". То есть не имеющий ничего общего с уже существующим.
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
30.04.2012, 19:27  [ТС] 3
Нет, не получается что-то.
Попробовал сначала создать кошку и собаку, а затем запихнуть их в массив с типом Animal.
Но почему-то после цикла новый метод у меня не пишет "New имя собаки: Baikal".

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
using System;
class Animal
{
    public Animal(string name)
    {
        this.name = name;
    }
 
    public virtual string getName()
    {
        return name;    
    }                            
 
    private string name;
 
}
 
class Cat : Animal
{
    public Cat(string name) : base(name){}
    public override string getName()
    {
        return "Overridden имя кошки: " + base.getName();
    }
}
 
class Dog : Animal
{
    public Dog(string name) : base(name){}
 
    new string getName()
    {
        return "New имя собаки: " + base.getName();
    }
 
}
 
 
class AnimalTest
{
    public static void Main()
    {
                Cat Murka = new Cat("Murka");
        Dog Baikal = new Dog("Baikal");
 
        Animal[] farm = new Animal[2];
            farm[0] = Murka;
        farm[1] = Baikal;
 
 
        foreach(Animal animal in farm)
        {
            Console.WriteLine(animal.getName());
        }
 
        Console.WriteLine(Baikal.getName());
 
    }
}
Изображения
 
0
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
30.04.2012, 21:06 4
Понял.
У вашего "нового" метода модификатор private, потому любой вызов публичного метода будет ссылаться на метод из класса Animal.
1
30.04.2012, 21:06
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.04.2012, 21:06
Помогаю со студенческими работами здесь

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

Переопределение метода базового класса
Есть библиотека, в которой находится базовый класс А, который содержит функцию проверки Check. Есть...

Перекрытие метода базового класса
Уважаемые форумчане, обьясните пожалуйста разницу между class A { public void...

Переопределение метода базового класса в производном
В базовом классе Base метод CreateObjMC создаёт объект производного класса, а в производном классе...


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

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

Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru