powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование и интерфейсы.
25 сообщений из 384, страница 5 из 16
Наследование и интерфейсы.
    #39720716
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisНужно четко понимать, что делаешь, и как код будет использоватьсяТС за это и топит.
Нафига оператор new для метода, если он то применяется то нет и компилятор молчит?
Я сам никогда не мешаю интерфейсы и обычные методы класса. И за то чтобы была однозначность. Либо переопределяем метод наследнике, либо нет..... Нельзя. Тогда будет простой хак класса.
Imho
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720733
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухAntonariyПоэтому с точки зрения исходников
пропущено...
это неверно. Где код реализации в наследнике? Нет его, он в родителе.
А что тогда по твоему в этом случае:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
interface ILamb
{
    void A();
    void B();
}

class LambOrdinary : ILamb
{
    public void A() => DoA();
    public void B() => DoB();

    protected virtual void DoA() => Console.WriteLine("Ordinary A");
    protected virtual void DoB() => Console.WriteLine("Ordinary B");
}

class LambOverboard : LambOrdinary
{
    protected override void DoB() => Console.WriteLine("Overboard B");
}


Наследник реализует, или не реализует, или частично реализует интерфейс? наследник наследует, дурня ты кусок.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720737
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в случае с override - переопределяет поведение, но не сигнатуру.
в случае с new - переопределяет и поведение и сигнатуру.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720739
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Нафига оператор new для метода, если он то применяется то нетчто значит "то нет"? в зависимости от погоды что ли?

Petro123 и компилятор молчит?А о чем он должен говорить?
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720740
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyв случае с override - переопределяет унаследованное поведение, но не сигнатуру.поправил
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720743
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisМинимум-то минимум, но чревато. Нужно четко понимать, что делаешь, и как код будет использоваться
Ну вообще тот же Рихтер утверждает, что EIMI нужно избегать, наколько это возможно, и использовать, только когда другого выхода нет, потому как потенциальных граблей в нем больше, чем плюсов. В это плане у EIMI с new много общего.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720747
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Я одним оператором переопределяю метод в наследнике. А внутри хочу вызываю базовый Папы метод, хочу не вызываю.
Получается один оператор в наследнике и один в базовом virtual.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720749
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА о чем он должен говорить?что вызов будет базового хотя оператор new
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720750
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА о чем он должен говорить?что вызов будет базового хотя оператор new. Задача не выполнена.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720755
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123AntonariyА о чем он должен говорить?что вызов будет базового хотя оператор new. Задача не выполнена.
Вообще-то new как раз и предназначен, чтобы компилятор молчал. Потому как всё, что делает этот new - это просто тупо подавление предупреждения компиляции. Скрытие метода вполне возможно и без new, но тогда компилятор будет выдавать предупреждения. Больше никакой другой магии в этом new нет.
А если программист сам собственноручно поставил в перекрытый метод new - значит, он вполне отдает себе отчет в том, что сделал, и чем это чревато. Ну, по крайней мере, наверное, разработчики компилятора так думают.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720758
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123AntonariyА о чем он должен говорить?что вызов будет базового хотя оператор newЕсли ты сам сокрыл (вот так правильно это методика называется - shadowing) базовый метод новым через new, а потом сам же вызвал из нового базовый, то причем тут компилятор? Ты в бессознательном состоянии код пишешь что ли? С какой стати компилятор должен тебе сообщать то, что ты сам же и делаешь? Может он еще должен арифметические операции комментировать? "Ахтунг, использован оператор +, следовательно произойдет сложение, а нихрена не вычитание!!11адин"
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720768
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныPetro123пропущено...
что вызов будет базового хотя оператор new. Задача не выполнена.
Вообще-то new как раз и предназначен, чтобы компилятор молчал.Вообще-то вот, что по этому поводу в MSDN написано:

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/declared-elements/shadowing The main purpose of shadowing is to protect the definition of your class members. The base class might undergo a change that creates an element with the same name as one you have already defined. If this happens, the Shadows modifier forces references through your class to be resolved to the member you defined, instead of to the new base class element.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720773
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСон Веры Павловныпропущено...

Вообще-то new как раз и предназначен, чтобы компилятор молчал.Вообще-то вот, что по этому поводу в MSDN написано:

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/declared-elements/shadowing The main purpose of shadowing is to protect the definition of your class members. The base class might undergo a change that creates an element with the same name as one you have already defined. If this happens, the Shadows modifier forces references through your class to be resolved to the member you defined, instead of to the new base class element.
Да, только этот shadowing вполне делается и без new.
Вот код, с которого всё началось:
Код: 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.
class Program
{
  static void Main()
  {
    ISpeak instance = new Foo();
    instance.SayWord();
    Console.WriteLine("done");
    Console.ReadKey(true);
  }
}

interface ISpeak
{
  void SayWord();
}

class Bar: ISpeak
{
  public void SayWord()
  {
    Console.WriteLine("i am a parent");
  }
}

class Foo: Bar
{
  public new void SayWord()
  {
    Console.WriteLine("i am a slave");
  }
}


IL-код и метаданные метода Foo.SayWord:
Код: 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.
.method public hidebysig instance void  SayWord() cil managed
{
  // Размер кода:       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "i am a slave"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Foo::SayWord

TypeDef #4 (02000005)
-------------------------------------------------------
  TypDefName: test2.Foo  (02000005)
  Flags     : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100000)
  Extends   : 02000004 [TypeDef] test2.Bar
  Method #1 (06000006) 
  -------------------------------------------------------
    MethodName: SayWord (06000006)
    Flags     : [Public] [HideBySig] [ReuseSlot]  (00000086)
    RVA       : 0x00002094
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    hasThis 
    ReturnType: Void
    No arguments.
  -------------------------------------------------------


Теперь убираем new:
Код: c#
1.
2.
3.
4.
5.
6.
7.
class Foo: Bar
{
  public void SayWord()
  {
    Console.WriteLine("i am a slave");
  }
}


Код: 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.
.method public hidebysig instance void  SayWord() cil managed
{
  // Размер кода:       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "i am a slave"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Foo::SayWord

TypeDef #4 (02000005)
-------------------------------------------------------
  TypDefName: test2.Foo  (02000005)
  Flags     : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100000)
  Extends   : 02000004 [TypeDef] test2.Bar
  Method #1 (06000006) 
  -------------------------------------------------------
    MethodName: SayWord (06000006)
    Flags     : [Public] [HideBySig] [ReuseSlot]  (00000086)
    RVA       : 0x00002094
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    hasThis 
    ReturnType: Void
    No arguments.
  -------------------------------------------------------


- как говорится, найдите 10 отличий.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720774
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Я не пойму. Всех ЯП задача чтобы компилятор замолчал решается аннотациями и другими средствами.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720783
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловны,
Я не пойму. Всех ЯП задача чтобы компилятор замолчал решается аннотациями и другими средствами.

Типичное применение new по мнению разработчиков такое: юзал ты какую-то библиотеку (1й слой), наследовался от ее классов, дополнял наследников своими методами, создавая промежуточный слой (2й), и этот слой пошел в дальнейшее использование другими разработчиками (3го слоя). А тут фигакс - в библиотеке появился метод, имеющий такое же название, как у тебя в наследнике, но с другой сигнатурой, другим функционалом, а на твоего наследника уже куча говнокода, использующего этот метод, в 3м слое накручено. Получается несовместимость, и чтобы не переименовывать метод, заставляя волком выть разработчиков 3го слоя, тебе дается возможность сокрыть нахрен метод 1го слоя.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720793
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТипичное применение new по мнению разработчиковтолько в шарпе?

Antonariyюзал ты какую-то библиотеку (1й слой),пример mdac

Antonariyсоздавая промежуточный слой (2й),пример ADOCommand обертка.

Antonariyразработчиками (3го слояпример, отдали клиенту.

AntonariyА тут фигакс - в библиотеке появился метод, имеющий такое же название, как у тебя в наследнике, но с другой сигнатурой,
Подробнее про Фигас. Как это случилось что появился наследник без компиляции.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720801
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий Мухпропущено...

А что тогда по твоему в этом случае:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
interface ILamb
{
    void A();
    void B();
}

class LambOrdinary : ILamb
{
    public void A() => DoA();
    public void B() => DoB();

    protected virtual void DoA() => Console.WriteLine("Ordinary A");
    protected virtual void DoB() => Console.WriteLine("Ordinary B");
}

class LambOverboard : LambOrdinary
{
    protected override void DoB() => Console.WriteLine("Overboard B");
}



Наследник реализует, или не реализует, или частично реализует интерфейс? наследник наследует, дурня ты кусок.
Что это значит, умника щепотка?

Реализация метода B в наследнике полностью своя, метода A унаследованная.
Как ты трактуешь такую ситуацию, когда половина реализации своя, а половина от базового класса?
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720802
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttЗаменить просто так работу какого-то метода...

Ога, прикинь? Или надо письмо разрабы писать, можно я унаследуюсь, мне там ерунда нужна.

Или у тебя опять флудо-генератор включился? Что характерно, к концу ветки - риск выставить себя дебилом ниже обычного; но знаешь, хвост, он ещё есть.)))

Надо понимать, что если ты хочешь изменить ни с того ни с сего работу одного метода, когда это не было изначально заложено разработчиком класса -- ты определённо собираешься написать говнокод.

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

Вся JAVA - говнокод?

Все шарповские методы расширения - говнокод?

Оператор new - говнокод?

Очень сложно писать нормальный код, которым можно было бы гордиться, когда повсюду... Говнокод.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720857
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомВся JAVA - говнокод?
В яве все методы виртуальные, выше уэто упоминалось.
Агнец за бортомВсе шарповские методы расширения - говнокод?
Тоже мимо, методы расширения не включаются в vtable класса, и не формируют его контракт.
Агнец за бортомОператор new - говнокод?
В 90% случаев - да. Особенно если вся кодовая база - собственная.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720859
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныВ 90% случаев - да. Особенно если вся кодовая база - собственная.+1
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720868
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

Ты зря бомбишь. Речь идёт о классе и его методах.

О принципах SOLID уже сказали.
О декораторе уже сказали.
Это всё с точки зрения проектирования, не "впихнуть невпихнуемое".

К вопросу, типа клал я на все эти принципы, как мне нагавнякать? Я отвечаю -- да хоть копипастом.
Пофигу :)
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720869
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомОператор new - говнокод?

Бред вообще какой-то.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720871
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомОчень сложно писать нормальный код, которым можно было бы гордиться, когда повсюду... Говнокод.


Если даже не пытаться и не думать головой, то будет 100% говнокод.
А идеального не существует. Это известно.
...
Рейтинг: 0 / 0
Наследование и интерфейсы.
    #39720891
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныВ 90% случаев - да. Особенно если вся кодовая база - собственная.

Можно пояснить? Поголовный DI?
...
Рейтинг: 0 / 0
25 сообщений из 384, страница 5 из 16
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование и интерфейсы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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