20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
1
.NET 4.x

Почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А?

04.02.2016, 18:51. Показов 500. Ответов 4
Метки нет (Все метки)

Поясните пожалуйста, почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А ?
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
        public class FooImp
        {
            public void Foo(A a)
            {
                Console.WriteLine("a");
            }
 
            public void Foo(B b)
            {
                Console.WriteLine("b");
            }
        }
 
        public class A
        {
            public void Foo(FooImp f)
            {
                f.Foo(this);
            }
        }
 
        public class B:A { }
 
        static void Main(string[] args)
        {                
                    
            var b = new B();
            b.Foo(new FooImp());
        }
Если посмотреть в дебагере на this внутри метода А.Foo то тип определяется как B.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2016, 18:51
Ответы с готовыми решениями:

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string...

Сделать так, чтобы при вызове метода запускался метод соответствующего класса
Имеется список объектов разных классов. У всех классов есть метод Method1. Чтобы засунуть объекты...

Почему при восходящем приведении типов вызывается метод класса потомка?
class T1 { public virtual void P() { Console.WriteLine(1); } } class T2 : T1...

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра
Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у...

4
Эксперт .NET
5340 / 4132 / 1187
Регистрация: 12.10.2013
Сообщений: 11,981
Записей в блоге: 2
04.02.2016, 19:07 2
NEvOl, вот вы и намудрили...
Вроде же все понятно. Идет поиск метода с подходящей сигнатурой. В самом классе B, его не найдено, и далее идет поиск в его базовых классах. Тот что подходит по сигнатуре и используется.
0
112 / 111 / 64
Регистрация: 03.06.2013
Сообщений: 582
04.02.2016, 19:12 3
NEvOl, очевидно что то не тот this, когда в классе используется слово this, оно указывает на экземпляр текущего класса, а никак на вызывающего или наследуемого.

Добавлено через 1 минуту
insite2012, молодой человек утверждает что "this" при вызове этого кусочка кода:
C#
1
2
3
4
public void Foo(FooImp f)
            {
                f.Foo(this);
            }
, это экземпляр класса B.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
04.02.2016, 19:19  [ТС] 4
MaxSlim, тогда не понимаю почему выводит на консоль B
C#
1
2
3
4
5
6
7
8
        public class A
        {
            public void Foo(FooImp f)
            {
                Console.WriteLine(this.GetType());
                f.Foo(this);
            }
        }
0
Эксперт .NET
5340 / 4132 / 1187
Регистрация: 12.10.2013
Сообщений: 11,981
Записей в блоге: 2
04.02.2016, 20:26 5
Цитата Сообщение от MaxSlim Посмотреть сообщение
это экземпляр класса B.
Да, так и есть.
Насколько я понял, тут вопрос другого плана. А именно о том, почему CLR выбирает именно эту перегрузку (с А в параметре), а не с B.

Добавлено через 4 минуты
Ааа, ну в принципе все ясно. Эта перегрузка и должна выбираться. Поскольку при вызове экземплярного метода в классе А ему передается ссылка на самого себя, то другая перегрузка просто не вызовется. Мало того, если убрать перегрузку с А в параметре, получим еще и ошибку компиляции.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2016, 20:26

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна...


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

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

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