powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование и интерфейсы.
25 сообщений из 384, страница 10 из 16
Наследование и интерфейсы.
    #39722368
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомТогда почему код на скриншоте ведёт себя так, как ведёт?
Мда.. IL показывали, метаданные методов показывали - не в коня корм.
Ну ладно, вот дампы MethodsTable (vtable, по сути). Получены с помощью windbg+sos.
а) в случае, когда метод только унаследован (определен только в Bar):
Код: 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.
0:000> !DumpHeap -type Foo
 Address       MT     Size
024d2338 00204e60       12     

Statistics:
      MT    Count    TotalSize Class Name
00204e60        1           12 test2.Foo
Total 1 objects
0:000> !DumpMT -MD 00204e60
EEClass:         002017d4
Module:          00204014
Name:            test2.Foo
mdToken:         02000005
File:            C:\Projects\.Net\_trash\tests\test2\test2\bin\Debug\test2.exe
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 6
Number of IFaces in IFaceMap: 1
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
6ea5ba80 6e668074 PreJIT System.Object.ToString()
6ea50ab0 6e66807c PreJIT System.Object.Equals(System.Object)
6ea5e910 6e66809c PreJIT System.Object.GetHashCode()
6ea5ba0c 6e6680b0 PreJIT System.Object.Finalize()
00350530 00204de4    JIT test2.Bar.SayWord()
003504c0 00204e58    JIT test2.Foo..ctor()


б) определен в Bar как виртуальный, и переопределен (override) в Foo:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
MethodDesc Table
   Entry MethodDe    JIT Name
6ea5ba80 6e668074 PreJIT System.Object.ToString()
6ea50ab0 6e66807c PreJIT System.Object.Equals(System.Object)
6ea5e910 6e66809c PreJIT System.Object.GetHashCode()
6ea5ba0c 6e6680b0 PreJIT System.Object.Finalize()
00270530 00194e58    JIT test2.Foo.SayWord()
002704c0 00194e60    JIT test2.Foo..ctor()


в) перекрыт (new) в Foo:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
MethodDesc Table
   Entry MethodDe    JIT Name
6ea5ba80 6e668074 PreJIT System.Object.ToString()
6ea50ab0 6e66807c PreJIT System.Object.Equals(System.Object)
6ea5e910 6e66809c PreJIT System.Object.GetHashCode()
6ea5ba0c 6e6680b0 PreJIT System.Object.Finalize()
00350530 00204de4    JIT test2.Bar.SayWord()
003504c0 00204e64    JIT test2.Foo..ctor()
00350080 00204e58   NONE test2.Foo.SayWord()
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722371
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом
Код: plaintext
Addxпропущено...


Потому что он так и должен себя вести!
Я пишу точные формулировки, а в ответ получаю демагогию.

Ладно.
пропущено...


Выделил ключевые моменты. Могу перевести или дополнить, если что-то непонятно.

Наследует реализацию и реализует - одно и тоже?

interface is inherited - наследует интерфейс. Никакого "наследования реализации".
Но, разумеется, для реализации интерфейса в наследнике нужно унаследовать реализацию из базового класса.
Взять ее просто больше неоткуда. Это прямо сказано в документации, и код ведет себя именно так.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722375
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Слушай, да мне пофиг на il/метаданные, что ты мне их суешь?

Ты вопроса не понимаешь?
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722378
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Addx
Сокрытие реализации - базовый принцип.

Сокрытие реализации было еще в Turbo Pascal 4.0, в 1987 году.
А никакого ООП там не было.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722380
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомСон Веры Павловны,

Слушай, да мне пофиг на il/метаданные, что ты мне их суешь?

Ты вопроса не понимаешь?
Я прекрасно понимаю, что кое-кто заблудился в трех соснах (вместо того, чтобы заниматься делом). На все заданные вопросы ответы уже были даны, всё остальное - либо троллинг, либо схоластика.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722381
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны...
Мда.. IL показывали, метаданные методов показывали - не в коня корм.
...


Ты тут не умничай, ты пальцем покажи. (с) )))
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722382
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВAddxСокрытие реализации - базовый принцип.

Сокрытие реализации было еще в Turbo Pascal 4.0, в 1987 году.
А никакого ООП там не было.

ООП подразумевает сокрытие реализации.
Наоборот - не всегда.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722385
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxТы тут не умничай, ты пальцем покажи. (с) )))
Так показано ведь - выделено красным в последнем блоке. При перекрытии метода базового у типа в vtable фактически образуется 2 метода с одинаковой сигнатурой, и для того, чтобы разрулить, какой из них вызывать, используется объявленный тип экземпляра объекта.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722389
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

это понятно и без IL и vtable.
Эти моменты прямо указаны в документации.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722396
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxСон Веры Павловны,

это понятно и без IL и vtable.
Эти моменты прямо указаны в документации.
Ну да. Однако некоторые до сих пор этого не могут понять - вот и приходится идти на крайние меры.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722402
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныОднако некоторые до сих пор этого не могут понять - вот и приходится идти на крайние меры.

Зачем? Тебя настолько где-то там унижают, что приходится тащить всё сюда?
Почему тебе "приходится"?
Я к стенке тебя не припираю.
Не нравится - иди мимо.

По IL-коду - почему ветер дует? Потому что деревья гнутся.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722405
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Addx,

Тогда скажи вот что.

Если

class subclass : baseClass - релизует интерфейс iParentable - и это однозначно, то как трактовать такую запись:

class subclass : baseClass, iParentable - в твоих же терминах.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722409
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомЗачем? Тебя настолько где-то там унижают, что приходится тащить всё сюда?
Почему тебе "приходится"?
Я к стенке тебя не припираю.
Не нравится - иди мимо.
О. В ход пошла тяжелая артиллерия - переход на личности. Нас ждет море конструктива.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722410
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныпереход на личности.

Да больно надо. Просто неловко видеть всю твою боль и завуалированные подъёбочки.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722414
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомAddx,

Тогда скажи вот что.

Если

class subclass : baseClass - релизует интерфейс iParentable - и это однозначно, то как трактовать такую запись:

class subclass : baseClass, iParentable - в твоих же терминах.

subclass реализует интерфейс iParentable , как же еще. Хоть в каждом промежуточном классе объяви, ничего не поменяется.

Если Вас интересуют детали реализации, то:

MSDNclass can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface.

никаких разночтений тут быть не может.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722415
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомДа больно надо. Просто неловко видеть всю твою боль и завуалированные подъёбочки.
Так Вы про это хотите поговорить? Или про интерфейсы и оператор new?
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722418
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомclass subclass : baseClass, iParentable - в твоих же терминах.интерфейс дважды?
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722419
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
Не ругайтесь.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722422
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxХоть в каждом промежуточном классе объяви,не люблю бардак
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722427
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123AddxХоть в каждом промежуточном классе объяви,не люблю бардак

В сложных случаях я предпочитаю явную реализацию. Не будет вопросов почему оно именно так работает.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722435
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Addxsubclass реализует интерфейс iParentable , как же еще.

Окей. Так вот - лично мне не нравится эта неоднозначность.

С точки зрения ООП и языка.

Код, что я привёл на скрине.

С использованием new - я получаю не желаемое поведение.
(subclass реализует интерфейс iParentable , как же еще)


С использованием virtual/override - желаемое.
(subclass реализует интерфейс iParentable , как же еще)


С использованием subclass : baseClass , iParentable - желаемое .
(subclass реализует интерфейс iParentable , как же еще)


Тогда как называется это всё время одинаково , и смысл кода - НЕ меняется (с моей точки зрения), а поведение - разное.

Как в анекдоте - "понять это невозможно, это надо запомнить".

С точки зрения ООП (не IL-кода или еще каких кишок) мне лично кажется непонятным:

Почему в JAVA я могу, при использовании DI:

1. Унаследоваться от класса.
2. Переопределить интересующий меня метод.
3. Воткнуть его в конфигурацию DI-контейнера.

И всё будет ок, а если разраб ПРЯМО ПРОТИВ изменения своего бриллиантового класса, то я получу ошибку компиляции .

А в шарпе я сделаю РОВНО тоже самое, мне компилятор скажет про new keyword, всё скомпилится - но в рантайме - всё пойдёт по звезде.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722437
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Агнец за бортомclass subclass : baseClass, iParentable - в твоих же терминах.интерфейс дважды?

Да.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722438
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомPetro123пропущено...
интерфейс дважды?

Да.в коде пробовал?
1. Я смысла не вижу.
2. Интерфейс становится не публичным.
Нет под рукой студии. Завтра.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722439
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123в коде пробовал?
Пробовал.

Petro1231. Я смысла не вижу.
Просто эксперимент.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39722440
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxВ сложных случаяхОК.
В сложных я срываю стоп кран и еду на ободах до шиномонтажа.
...
Рейтинг: 0 / 0
25 сообщений из 384, страница 10 из 16
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование и интерфейсы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]