Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
5 / 3 / 1
Регистрация: 31.03.2014
Сообщений: 200
1

Полимофризм

13.12.2014, 17:55. Показов 1113. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
class BaseClass
    {
        public virtual void Method()
        {
            Console.WriteLine("Method from BaseClass");
        }
    }
 
class DerivedClass : BaseClass
    {
 
        public override void Method()
        {
            Console.WriteLine("Method from DerivedClass");
        }
    }
 
class Program
    {
        static void Main()
        {
            DerivedClass instance = new DerivedClass();
            instance.Method();
         
            BaseClass instanceUp = instance;
            instanceUp.Method();
 
            Console.ReadKey();
        }
    }
Почему метод instanceUp.Method(); вызывает Method from DerivedClass?
0
Лучшие ответы (1)
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.12.2014, 17:59 2
Цитата Сообщение от newbiecoderr Посмотреть сообщение
Почему метод instanceUp.Method(); вызывает Method from DerivedClass?
А как должен?
Внимательно посмотрите:
1. Создали ссылку типа класса наследника и присвоили ей экземпляр объекта.
2. Вызвали метод.
3. Создали ссылку типа класса родителя и присвоили ей экземпляр класса наследника.
3. Вызвали метод.
Какой метод должен вызваться? Экземпляр-то всего один, типа класса наследника.
1
5 / 3 / 1
Регистрация: 31.03.2014
Сообщений: 200
13.12.2014, 18:08  [ТС] 3
insite2012, а если бы в Base ещё был бы void метод, и его вызвать через instanceUp.Method2(); он бы вызывался из экземпляра наследника?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.12.2014, 18:10 4
Если он не переопределен в наследнике (если он virtual) и public (или protected) - то вызвался бы из базового, естественно.
1
5 / 3 / 1
Регистрация: 31.03.2014
Сообщений: 200
13.12.2014, 18:18  [ТС] 5
insite2012, а если Derived такой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class DerivedClass : BaseClass
    {
        // Переопределение метода базового класса.
 
        public override void Method()
        {
            Console.WriteLine("Method from DerivedClass");
        }
        public void Method2()
        {
            Console.WriteLine("azaza");
        }
    }
Почему я не могу вызвать instanceUp.Method2();
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.12.2014, 18:24 6
Цитата Сообщение от newbiecoderr Посмотреть сообщение
Почему я не могу вызвать instanceUp.Method2();
Потому что у вас переменная (ссылка) типа базового класса, а он ничего об этом методе не знает. Приведите явно ссылку к типу класса наследника и вызывайте. Примерно так:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
 
namespace ConsoleApplication69 {
    class Program {
        static AutoResetEvent wh = new AutoResetEvent(false);
 
        static void Main(string[] args) {
            DerivedClass instance = new DerivedClass();
            instance.Method();
 
            BaseClass instanceUp = instance;
            ((DerivedClass)instanceUp).Method2();
            Console.ReadLine();
        }
 
        
    }
    class BaseClass {
        public virtual void Method() {
            Console.WriteLine("Method from BaseClass");
        }
       
    }
 
    class DerivedClass : BaseClass {
 
        public override void Method() {
            Console.WriteLine("Method from DerivedClass");
        }
        public void Method2() {
            Console.WriteLine("azaza");
        }
    }
}
1
5 / 3 / 1
Регистрация: 31.03.2014
Сообщений: 200
13.12.2014, 18:57  [ТС] 7
insite2012,
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 BaseClass
    {
        public virtual void Method()
        {
            Console.WriteLine("Method from BaseClass");
        }
    }
 
class DerivedClass : BaseClass
    {
 
        public override void Method()
        {
            Console.WriteLine("Method from DerivedClass");
        }
 
        public void Method2()
        {
            Console.WriteLine("azaza");
        }
    }
 
class Program
    {
        static void Main()
        {
            DerivedClass instance = new DerivedClass();
            instance.Method();
         
            BaseClass instanceUp = instance;
            instanceUp.Method();
            instanceup.Method2();//нельзя
 
            Console.ReadKey();
        }
    }
Почему тогда можно вызвать Method который находится в производном классе и нельзя вызвать Method2 который находится там же. Оба по ссылке instanceUp
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
13.12.2014, 19:01 8
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

Цитата Сообщение от newbiecoderr Посмотреть сообщение
Почему тогда можно вызвать Method
Ну это же очевидно. Он есть в базовом классе. Естественно, мы можем его вызвать. Но поскольку ссылке типа класса родителя присвоен экземпляр класса наследника, а этот метод в наследнике переопределен, то именно он и вызывается.
1
13.12.2014, 19:01
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru