Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Полиморфизм и другие анонизмы.... / 5 сообщений из 5, страница 1 из 1
27.02.2004, 18:28
    #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
27.02.2004, 20:35
    #32424970
C#++
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм и другие анонизмы....
вместо public new virtual void Sort()
надо public new override void Sort()
(так наверное)
...
Рейтинг: 0 / 0
27.02.2004, 23:07
    #32425051
BOOкер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полиморфизм и другие анонизмы....
Книжку, Кгижку почитай. (moderated)
...
Рейтинг: 0 / 0
27.02.2004, 23:34
    #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
27.02.2004, 23:44
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Полиморфизм и другие анонизмы.... / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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