Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли писать "виртуальные-методы-расширения / 10 сообщений из 10, страница 1 из 1
27.02.2014, 19:19
    #38574638
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
Привет.

Можно ли писать "виртуальные-методы-расширения" ?

Я отнаследовал свой класс от системного.
А затем для ОБОИХ написал методы расширения с идентичными именами - мне просто нужно их обрабатывать немного по разному.

и теперь в коде приходится писать


Код: c#
1.
2.
3.
4.
5.
6.
7.
         private void SomeMethod (SysElement elem)
         {
            if (elem is MyElement)
                (elem as MyElement).MyMethod();
            else
                elem.MyMethod();
         }



Причем вызывать этот MyMethod приходится во многих местах программы. И такой код выглядит очень раздутым - чем если бы это были виртуальные методы и можно было бы просто вызвать метод MyMethod().

Просто суть в том, что я не имею доступа к системному классу, очевидно, и не могу добавить ему виртуальный метод. использую метод расширения.

Как можно все сделать, чтобы код выглядел компактным ?
...
Рейтинг: 0 / 0
27.02.2014, 19:40
    #38574654
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
MsSql_StudyЯ отнаследовал свой класс от системного.
А затем для ОБОИХ написал методы расширения с идентичными именами - мне просто нужно их обрабатывать немного по разному.
А сделать ветвление в методе для базового класс разве нельзя?

Код: 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.
void Main()
{
	(new a()).Foo();
	(new b()).Foo();
	((a)(new b())).Foo();
	
}

public class a
{

}

public class b : a
{

}

public static class ext
{
	public static void Foo(this a obj)	
	{
		var x = obj as b;
		if (x != null)
			x.ToString().Dump();
		else
			obj.ToString().Dump();
	}
}




Ну и наследование еще есть :)
...
Рейтинг: 0 / 0
27.02.2014, 20:01
    #38574675
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
А еще, если не путаю, можно написать 2й ext метод для класса потомка:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class A
{

}

public class B : A
{

}

public static class ext
{
	public static void Foo(this A item)
	{

	}

	public static void Foo(this B item)
	{

	}

}

...
Рейтинг: 0 / 0
27.02.2014, 20:04
    #38574680
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
buser,

Я мало подумал, прежде чем тему создавать :)
Сам тоже к этому решению и пришел.

Пока код писал и обдумывал, понял что можно просто оставить метод расширение только для базового класса и уже в самом методе проверять тип, и уже вызывать специфические методы (они то как раз уже приватные).


Наследование не подходит. Выгода метода-расширения в данном моем случае, была просто в краткости написания кода:
GetSysElement.SomeMethod();

Сам метод SomeMethod никакого отношения к логике работы класса SysElement не имеет. Нечего переопределять в общем.

Спасибо !
...
Рейтинг: 0 / 0
27.02.2014, 20:07
    #38574684
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
MsSql_Study,

Извиняюсь, не дочитал ваше сообщение )
...
Рейтинг: 0 / 0
27.02.2014, 20:08
    #38574685
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
LelouchА еще, если не путаю, можно написать 2й ext метод для класса потомка:


Именно так и было :)
Но работа шла с базовым классом. Т.е. в методы приходит SysElement и поэтому вызывался его метод.

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

Сделал, как buser рекомендовал, все просто получилось :)
...
Рейтинг: 0 / 0
27.02.2014, 20:08
    #38574686
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
LelouchMsSql_Study,

Извиняюсь, не дочитал ваше сообщение )

Извиняюсь. Я тоже не дочитал Вашего )

Я чаще стараюсь ответить быстрее, чем прочитать все до конца - боюсь забыть ответить видимо :)
...
Рейтинг: 0 / 0
28.02.2014, 14:55
    #38575336
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
MsSql_StudyLelouchА еще, если не путаю, можно написать 2й ext метод для класса потомка:


Именно так и было :)
Но работа шла с базовым классом. Т.е. в методы приходит SysElement и поэтому вызывался его метод.

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

Сделал, как buser рекомендовал, все просто получилось :)


buser фигню порекомендовал

нахрена тут вообще какие-то статики нужны
...
Рейтинг: 0 / 0
28.02.2014, 15:11
    #38575363
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
pation, я не рекомендовал - просто предложил :) а рекомендовать тут можно GoF :)
Хотя, лично мне кажется, что все можно сделать проще, просто я ни задачи до конца не знаю ни ограничений автора :)
а статики тут появились исключительно в контексте extension methods :)
...
Рейтинг: 0 / 0
28.02.2014, 15:45
    #38575408
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли писать "виртуальные-методы-расширения
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли писать "виртуальные-методы-расширения / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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