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

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

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

беру таймауткнижку почитай
...
Рейтинг: 0 / 0
07.05.2019, 15:56
    #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
07.05.2019, 20:09
    #39810923
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрытие метода потомком.
коллеги, спасибо
...
Рейтинг: 0 / 0
08.05.2019, 10:04
    #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
08.05.2019, 10:04
    #39811120
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрытие метода потомком.
т.е. new чисто для интелисенс
...
Рейтинг: 0 / 0
08.05.2019, 10:05
    #39811121
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрытие метода потомком.
и new с c# 7 вроде как
...
Рейтинг: 0 / 0
08.05.2019, 10:25
    #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
08.05.2019, 10:29
    #39811141
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрытие метода потомком.
listtoviewт.е. new чисто для интелисенс
Интеллисенс тут ни при чем - читай выше, написано же - чтобы компилятор не выдавал ворнинг о том что ты готовишься себе в ногу выстрелить. Но, если у вас на ворнинги компилятора (как во многих местах делается) внимания вообще не обращают, то может оно вам вообще и не нужно :))
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перекрытие метода потомком. / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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