powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Переписать только геттер при наследовании
25 сообщений из 148, страница 2 из 6
Переписать только геттер при наследовании
    #38623582
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Оверрайдить через оверлоад.
=)) писец
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623612
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationuser7320Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new"
я же спрашивал тебя =))
учи матчасть
Не люблю я ответы, где из всего стоящее только "учи матчасть". Можно форумы все позакрывать и повесить заглушку на главную с крупными буквами "УЧИ МАТЧАСТЬ". Ну и баннеров вокруг понавтыкать.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623621
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Вот тем, у тех, у кого нет такой специфики - действительно, у них М и ВМ выглядят одинаково и ВМ так кажется лишним слоем.Не лишним, а чем-то отличающимся от других слоёв логики настолько, чтобы иметь специальное название.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623625
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Class
{
  public virtual void Foo()
  {
    Console.WriteLine("Class.Foo");
  }
}

public class Derived1: Class
{
  public new void Foo()
  {
    Console.WriteLine("Derived1.Foo");
  }
}



а теперь попробуй создать класс Derived2 : Derived1, в котором оверрайдится Foo. Это раз.
Далее:
Код: c#
1.
2.
Class v = new Derived1();
v.Foo();


Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623640
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationuser7320Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new"
я же спрашивал тебя =))
учи матчасть

Я вот не знаю, как это понимать:
http://msdn.microsoft.com/en-us/library/435f1dw2.aspx It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. The new modifier creates a new member with the same name and causes the original member to become hidden. The override modifier extends the implementation for an inherited member.
Наверное, отличия во внутреннем представлении в CLR или где там. А для программиста это выглядит одинаково - и так и так (и через new, и через override) я скрываю метод базового класса и не могу его вызвать из текущего класса. Но могу вызвать его через base или через приведение к базовому.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623657
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Или вы очень криво выражаетесь, или не понимаете, что override и new это совершенно разные вещи:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class A
{
     public virtual void M() { throw new Exception(); }
}

public class B : A
{
     public override void M() { Console.WriteLine("B"); }
}

public class C : A
{
     public new void M() { Console.WriteLine("C"); }
}

new B().M() // "B"
((A)(new B())).M() // "B"

new C().M() // "C"
((A)(new C())).M() // Exception
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623659
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныuser7320,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Class
{
  public virtual void Foo()
  {
    Console.WriteLine("Class.Foo");
  }
}

public class Derived1: Class
{
  public new void Foo()
  {
    Console.WriteLine("Derived1.Foo");
  }
}



а теперь попробуй создать класс Derived2 : Derived1, в котором оверрайдится Foo. Это раз.

Ну, второй-то Фу я прооверрайдю (через ещё один new), а первый-то нет - он же скрыт.

Ну, я понял теперь, в чём разница. Но для первого уровня наследования разницы нет?

Сон Веры ПавловныДалее:
Код: c#
1.
2.
Class v = new Derived1();
v.Foo();


Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов.
В выводе будет Фу от Class. Почему - не знаю.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623660
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныДалее:
Код: c#
1.
2.
Class v = new Derived1();
v.Foo();


Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов.
При этом при оверрайде - Фу от Derived1.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623668
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

у меня такой вывод:

// Если в Derived1 new

Class.Foo
Derived1.Foo
Derived2.Foo
Class.Foo
ConsoleApplication1.Derived1


// Если в Derived1 override

Class.Foo
Derived1.Foo
Derived2.Foo
Derived1.Foo
ConsoleApplication1.Derived1

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class Class
{
	public virtual void Foo()
	{
		Console.WriteLine("Class.Foo");
	}
}

public class Derived1 : Class
{
	public new void Foo()
	{
		Console.WriteLine("Derived1.Foo");
	}
}

public class Derived2 : Derived1
{
	public new void Foo()
	{
		Console.WriteLine("Derived2.Foo");
	}
}


class Program
{
	static void Main(string[] args)
	{
		Class c = new Class();
		c.Foo();
		Derived1 d1 = new Derived1();
		d1.Foo();
		Derived2 d2 = new Derived2();
		d2.Foo();
		Class cc = new Derived1();
		cc.Foo();
		Console.WriteLine(cc.GetType());

		Console.Read();
	}
}

...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623669
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Модификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена.

Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623682
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchuser7320,

Модификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена.

Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx
Так я про то же цитату и привёл. И мне эти слова мало о чём говорят. Чем "сокрытие" отличается от "расширения"? Без примеров это пустые слова.

Ну, мне уже объяснили выше. Правда, я всё равно не понял, почему это так происходит.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623686
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchuser7320,
Или вы очень криво выражаетесь, или не понимаете, что override и new это совершенно разные вещи:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class A
{
     public virtual void M() { throw new Exception(); }
}

public class B : A
{
     public override void M() { Console.WriteLine("B"); }
}

public class C : A
{
     public new void M() { Console.WriteLine("C"); }
}

new B().M() // "B"
((A)(new B())).M() // "B"

new C().M() // "C"
((A)(new C())).M() // Exception


Это то же, что и у Сон Веры Павловны. Я всё равно не понимаю, почему это так происходит.

Кстати, вот эти ваши слова
авторМодификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена.

Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx
противоречат вашему примеру. В примере в третьем случае new должен скрыть исключение (ну таписано же так!), а он его наоборот - показывает.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623691
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

и в рантайме ((A)(new C())) является типом С, а не А (в аналогичном примере Сон Веры Павловны это видно - я GetType() вызывал). Но вызывается метод из А почему-то.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623695
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут ещё что-то намешно из приведения типов. Вот в МСДН для new простой пример приведён без приведения типов - и работает всё так, как объяснено. Но стоит только войти в игру приведению типов, как всё с ног на голову встаёт.
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623734
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

(То что я описываю - мое упрощенное понимание, судя по http://msdn.microsoft.com/en-us/magazine/cc163791.aspx - все несколько сложнее)

потому что метод C.M() это новый метод, никакого отношения к A.M() не имеющий.
Судя по сигнатуре вызова метода в IL (пример отсюда ): IL_0002: call instance void ConsoleApplication1.Base::foo()
для
((A)(new B())).M()
((A)(new C())).M()
вызов в IL будет выглядеть одинаково: call instance void A::M();

Так как метод M() вирутальный, то будет применен виртуальный вызов. CLR определит реальный тип объекта (B и С) и начнет искать "ближайшее" к ним в иерархии наследования переопределение меторда.
В случае класса B - это переопределение выполнено в нем самом, будет взята его релизация.
В случае класса C - переопределение не выполнялось, метода C.M() нет в таблице виртуальных методов (если добавить если слово Virtual, он там появится, НО! это в любом случае совершенно новый метод, не имеющий отношения к методу A.M(), и не являющийся его новой реализацией) - поэтому будет вызван метод A.M();

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

поправка, вызов будет callvirt instance void A::M() (виртуальный вызов)
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623771
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,
авторТак как метод M() вирутальный, то будет применен виртуальный вызов
и да и нет, виртуал может быть и для простого экземплярного, и просто call все зависит от кода..

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 class Program
    {
        static void Main(string[] args)
        {
            var e = new MyClass().Foo();//?
            var f= new MyClass();
            var ee = f.Foo();//?
        }

        class MyClass
        {
            public  int Foo()
            {
                return 3;
            }
        }
    }
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623779
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

я же говорил о своем примере, метод A::M() помечен как виртуальный
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623783
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,
я ничего против не имею, но строчку "Так как метод M() вирутальный, то будет применен виртуальный вызов" можно и убрать
так как она наводит на мысль, если метод будет не виртуальный то и вызов будет не вертуальный..
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623787
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

да я бы там много что брал, в том числе орфографические ошибки) но кнопки редактирования нет )
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623825
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchuser7320,

(То что я описываю - мое упрощенное понимание, судя по http://msdn.microsoft.com/en-us/magazine/cc163791.aspx - все несколько сложнее)

потому что метод C.M() это новый метод, никакого отношения к A.M() не имеющий.
Судя по сигнатуре вызова метода в IL (пример отсюда ): IL_0002: call instance void ConsoleApplication1.Base::foo()
для
((A)(new B())).M()
((A)(new C())).M()
вызов в IL будет выглядеть одинаково: call instance void A::M();

Так как метод M() вирутальный, то будет применен виртуальный вызов. CLR определит реальный тип объекта (B и С) и начнет искать "ближайшее" к ним в иерархии наследования переопределение меторда.
В случае класса B - это переопределение выполнено в нем самом, будет взята его релизация.
В случае класса C - переопределение не выполнялось, метода C.M() нет в таблице виртуальных методов (если добавить если слово Virtual, он там появится, НО! это в любом случае совершенно новый метод, не имеющий отношения к методу A.M(), и не являющийся его новой реализацией) - поэтому будет вызван метод A.M();
Я вот чего не понимаю. Почему "реальный тип объекта" - В и С, а метод вызывается как от А? Я так понимаю, что приведение к менее унаследованному типу как бы "отсекает" функциональность более унаследованных типов. Да? Но при этом объект остаётся по-прежнему более унаследованным, а не тем, к которому он приведён. Так?
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623828
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320менее унаследованному
user7320более унаследованным
что за терминология?
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623901
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилuser7320менее унаследованному
user7320более унаследованным
что за терминология?Нечёткая логика?
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623902
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Не пойму, ты с ООП что ли не знаком? В ужасе читать классику про инкапсуляция/наследование/ полиморфизм .
...
Рейтинг: 0 / 0
Переписать только геттер при наследовании
    #38623916
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы меня запутали! Это вы во всём виноваты! До того, как я сюда зашёл, у меня был нормальный такой маленький new, который оверрайдил оверлоадом геттер свойства более унаследованного класса и вообще работал. А с вами я скоро алфавит начну забывать, не то, что нечёткую логику пременять.

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


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