powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Полиморфизм и другие анонизмы....
5 сообщений из 5, страница 1 из 1
Полиморфизм и другие анонизмы....
    #32424855
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class Window
{
 public virtual void Sort()
 {
  System.Console.WriteLine( "Virtual method Window.Sort()" );
 }
}

public class ListBox:Window
{
 public new virtual void Sort()
 {
  System.Console.WriteLine( "New virtual method ListBox.Sort()" );
 }
}

public class Button:ListBox
{
 public static void Main()
 {
  Button b1 = new Button();
  b1.Sort();
 }
}


Код: plaintext
1.
2.
F:\work\C#>Window.exe
New virtual method ListBox.Sort()


Автор в книге http://www.books.ru/shop/books/31350 пишет:

Что-бы ListBox унаследованный от Window смог создать свой public virtual void Sort(), в том случае когда у Window тоже есть подобный метод, нужно добавить слово "new". Это вроде как всё понятно. Но после он говорит (стр.133), что "...и тогда этот метод не будет переопределять виртуальный метод класса Window".

Вот здесь у меня непонимание. Если он не переопределят, тогда что-же он делает? Однозначно, что не наследует.

Пример выше как раз показывает что именно переопределяет. Так класс Button унаследованный от ListBox наследует именно преопределённый метод ListBox-а.

Может тут просто с терминами что-то напутано.

Ваши комментарии.
...
Рейтинг: 0 / 0
Полиморфизм и другие анонизмы....
    #32424970
C#++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вместо public new virtual void Sort()
надо public new override void Sort()
(так наверное)
...
Рейтинг: 0 / 0
Полиморфизм и другие анонизмы....
    #32425051
BOOкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Книжку, Кгижку почитай. (moderated)
...
Рейтинг: 0 / 0
Полиморфизм и другие анонизмы....
    #32425058
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнадо public new override void Sort()

Это вызовет ошибку, так делать нельзя.
А насчёт new – я так понимаю, что тут никакого полиморфизма уже не будет, это просто другой метод с тем же именем, что и у класса-родителя

Пример полиморфизма

Код: plaintext
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.
using System;
namespace hDrummer.Number4Polymorphism
{
	class Starter
	{
		[STAThread]
		static void Main(string[] args) 
		{
			// создадим три объекта всех трёх классов 
			OneWordWriter w1 = new OneWordWriter(); 
			TwoWordsWriter w2 = new TwoWordsWriter(); 
			ThreeWordsWriter w3 = new ThreeWordsWriter(); 
			w1.Write(); 
			// вывод One 
			((OneWordWriter)w2).Write(); 
			// вывод Two words 
			((OneWordWriter)w3).Write(); 
			// вывод Three words written 
		} 
	}
	class OneWordWriter 
	{ 
		public virtual void Write() 
		{ 
			Console.WriteLine( "One" ); } 
	} 

	class TwoWordsWriter:OneWordWriter 
	{
			public override void Write() 
	  { 
		  Console.WriteLine( "Two words" ); 
	  } 
	} 

	class ThreeWordsWriter :TwoWordsWriter 
	{ 
		public override void Write() 
		{ 
			Console.WriteLine( "Three words written" ); } 
	}
} 


Если же мы изменим код так

Код: plaintext
public new void Write() { Console.WriteLine( "Three words written" ); } 


то вывод будет уже не такой -

w1.Write();
// вывод One
((OneWordWriter)w2).Write();
// вывод Two words
((OneWordWriter)w3).Write();
---->>>> // вывод Two words
...
Рейтинг: 0 / 0
Полиморфизм и другие анонизмы....
    #32425059
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что интересно, если добавить вот такой класс

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	class ThreeWordsWriter :TwoWordsWriter 
	{ 
 -->>>		public new virtual void Write() 
 
		{ 
			Console.WriteLine( "Three words written" ); } 
	}

	class FourWordsWriter :ThreeWordsWriter 
	{ 
		public override void Write() 
		{ 
			Console.WriteLine( "Four words written" ); } 
	}


и написать так -
((OneWordWriter)w4).Write();
и так
((ThreeWordsWriter)w4).Write();

вывод будет соответственно
Two words
Four words written

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


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