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

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

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

Студворк — интернет-сервис помощи студентам
В базовом классе метод помечен как 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2012, 17:33
Ответы с готовыми решениями:

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

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

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

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

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

На всякий случай: "new" с английского переводится как "новый". То есть не имеющий ничего общего с уже существующим.
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,239
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
17438 / 12830 / 3361
Регистрация: 17.09.2011
Сообщений: 21,108
30.04.2012, 21:06 4
Понял.
У вашего "нового" метода модификатор private, потому любой вызов публичного метода будет ссылаться на метод из класса Animal.
1
30.04.2012, 21:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2012, 21:06
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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