powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перекрытие метода потомком.
18 сообщений из 18, страница 1 из 1
Перекрытие метода потомком.
    #39810659
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно что наряду с override можно чз new перекрыть
просто если нужно вызвать метод собственного типа, ну так приведи к типу и вызывай
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810660
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new в c# 7
раньше просто пишешь метод и все
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810662
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааа, не получится просто привести
попадос
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810663
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewСтранно что наряду с override можно чз new перекрыть
Шо, опять?
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810666
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныlisttoviewСтранно что наряду с override можно чз new перекрыть
Шо, опять?
ну если привести к базовому типу, но метод все равно собственный будет вызван
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810667
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стоп
что то я запутался

беру таймаут
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810672
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получится и без new, но будет ворнинг вылазить. Спецом так сделано, чтобы ты понимал, что делаешь. А вообще это "плохая практика". Даже очень плохая.
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810678
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewСон Веры Павловныпропущено...

Шо, опять?
ну если привести к базовому типу, но метод все равно собственный будет вызван
В смысле, на колу мочало, старая тема 52-й раз?
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810690
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможность такая есть, но вот использовать её не стоит, имхо.
Если такая необходимость всё же есть, возможно имеет смысл определить интерфейс с вашим методом, а в классе создать закрытую реализацию этого метода и работать с ним через этот интерфейс, чем перекрывать существующие методы.
Назовите его MethodEx, Method2, MethodByListtiview, может это и более уродское название, но это лучше, чем перекрывать методы базового класса. Тем более, что это не отменяет того, что я смогу их вызвать просто приведя тип к базовому.
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810711
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewnew в c# 7
раньше просто пишешь метод и все
Данунах. Это было начиная с самой первой версии.
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810730
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewстоп
что то я запутался

беру таймауткнижку почитай
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810757
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewстоп
что то я запутался

беру таймаут

Все очень просто на самом деле. Если метод переопределен (new), то конкретный метод для вызова будет выбран во время компиляции, в соответствии с тем, каким типом объявлена переменная.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Foo() {
   public void HelloWorld() => Console.WriteLine("Hello from Foo");
}

class Bar: Foo {
   public new void HelloWorld() => Console.WriteLine("Hello from Bar");
}

Bar bar = new Bar();
Foo foo = new Bar();

bar.HelloWorld(); // "Hello from Bar", потому что bar объявлена как Bar
foo.HelloWorld(); // "Hello from Foo", потому что хоть foo на самом деле инстанс Bar, но объявлен все-таки как Foo



В случае с перегрузкой (override) выбор метода происходит во время выполнения (таблица виртуальных методов), и поэтому вызовется метод, который принадлежит реальному типу объекта

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Foo() {
   public virtual void HelloWorld() => Console.WriteLine("Hello from Foo");
}

class Bar: Foo {
   public override void HelloWorld() => Console.WriteLine("Hello from Bar");
}

Bar bar = new Bar();
Foo foo = new Bar();

bar.HelloWorld(); // "Hello from Bar", потому что bar объявлена как Bar
foo.HelloWorld(); // снова "Hello from Bar", потому что реальный тип foo это на самом деле Bar



В общем-то перегружать методы которые имеют реализацию это тоже не очень хорошая практика. Правильней делать базовый абстрактный класс с абстрактным методом и перегружать этот абстракный метод. Единственное исключение - это какая-нибудь очевидная базовая реализация по-умолчанию (например, вообще пустая).
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39810923
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги, спасибо
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39811118
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если без new

Код: c#
1.
2.
3.
4.
5.
6.
7.
class Foo() {
   public void HelloWorld() => Console.WriteLine("Hello from Foo");
}

class Bar: Foo {
   public new void HelloWorld() => Console.WriteLine("Hello from Bar");
}



я так понимаю будет то же самое что с new, только интелисенс подчеркивает зеленой волнистой
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39811120
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. new чисто для интелисенс
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39811121
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и new с c# 7 вроде как
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39811139
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewи new с c# 7 вроде как
Вот самая старая спека ECMA которую удалось сейчас найти. Это кажись самая первая версия C.
ECMA-334, 1st editionA class-member-declaration is permitted to declare a member with the same name or signature as an inherited member. When this occurs, the derived class member is said to hide the base class member. Hiding an inherited member is not considered an error, but it does cause the compiler to issue a warning. To suppress the warning, the declaration of the derived class member can include a new modifier to indicate that the derived member is intended to hide the base member.
...
Рейтинг: 0 / 0
Перекрытие метода потомком.
    #39811141
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoviewт.е. new чисто для интелисенс
Интеллисенс тут ни при чем - читай выше, написано же - чтобы компилятор не выдавал ворнинг о том что ты готовишься себе в ногу выстрелить. Но, если у вас на ворнинги компилятора (как во многих местах делается) внимания вообще не обращают, то может оно вам вообще и не нужно :))
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перекрытие метода потомком.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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