Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];

Вниз

С# и проверка абстрактных методов   Найти похожие ветки 

 
KSergey ©   (2014-03-30 13:23) [0]

Что хочется сделать:

Пусть есть некий класс, в нём 100 абстрактных методов.
Часть этих методов (именно часть!) будет перекрыта в потомке.
И перекрытые (только перекрытые в потомке методы) будут вызываться на некие события.
Те события, для которых абстрактные методы фактически не реализованы, не должны приводить к вызову соответствующих методов.

Понятно, что можно сделать в базовом классе 100 виртуальных методов и синтаксически проблема как бы отпадёт сама собой. Но беда в том, что вызвать метод из события - весьма затратная процедура (затратна подготовка аргументов). Кроме того предполагается, что из 100 доступных методов (т.е. соответсвующим 100 различным событиям) в конкретной реализации будут нужны (реализованы) только 5...10.

События отменить нельзя, они все 100 будут возникать. Вот и хотелось бы сэкономить и не делать формирование аргументов для тех методов, фактическая реализация которых - отсутствует.

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

Вопрос: подскажите, какой бы механизм поиспользовать, при котором можно было бы
- фактически определять не все потенциально доступные методы предка
- быстро и дешево определять есть ли в потомке фактическая реализация того или иного метода, или нет.


 
clickmaker ©   (2014-03-30 14:13) [1]

как вариант
var assembly = Assembly.GetExecutingAssembly();
var type = assembly.GetType("MyClass");
var method = type.GetMethod("MyMethod");
if (method != null) {
 method.Invoke();
}


 
clickmaker ©   (2014-03-30 16:16) [2]

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


 
картман ©   (2014-03-30 16:50) [3]


> Вопрос: подскажите, какой бы механизм поиспользовать, при
> котором можно было бы
> - фактически определять не все потенциально доступные методы
> предка
> - быстро и дешево определять есть ли в потомке фактическая
> реализация того или иного метода, или нет.

TChild
 fImplementList

но, кажется, это моветон - слишком просто


 
clickmaker ©   (2014-03-30 19:10) [4]

вдогонку к [1]
var method = type.GetMethod("MyMethod", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly);

найдет только если в MyClass MyMethod - override


 
KSergey ©   (2014-03-31 09:29) [5]

> clickmaker ©   (30.03.14 16:16) [2]
> только непонятно, как ты скомпилишь класс, который не реализует
> абстрактные методы своего предка...

Да, в этом проблема в том числе )
Про абстрактный предок - я так, чего знаю - то и написал. Видимо правильно было говорить про интерфейс, часть методов которого инплементирована.

> clickmaker ©   (30.03.14 19:10) [4]
> найдет только если в MyClass MyMethod - override

Вероятно то, что надо (ну если в базовом классе не абстрактные
методы описать, а просто пустышки виртуальные)

> картман ©   (30.03.14 16:50) [3]
> TChild
>  fImplementList

Тоже попробую, спасибо.


 
clickmaker ©   (2014-03-31 10:02) [6]

> Видимо правильно было говорить про интерфейс, часть методов
> которого инплементирована.

в данном случае это то же самое. Класс обязан реализовать методы интерфейса хотя бы в виде заглушек


 
KSergey ©   (2014-03-31 10:15) [7]

Блин! что же делать, шеф, что же делать??


 
clickmaker ©   (2014-03-31 10:24) [8]

> [7] KSergey ©   (31.03.14 10:15)

см. [4]
public class MyClassBase
{
 public virtual void Method1() {}
 public virtual void Method2() {}
}
public class MyClass: MyClassBase
{
 public override void Method1() {}
}

var type = assembly.GetType("MyClass");
var method = type.GetMethod("Method1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly);
//method != null
var method = type.GetMethod("Method2",...);
//method == null



 
KSergey ©   (2014-03-31 15:16) [9]

понял, большое спасибо!!
осталось ежа с ужом скрестить


 
ухты   (2014-04-02 15:01) [10]

похоже что с архитектурой швах


 
KSergey ©   (2014-04-03 14:57) [11]

Расскажите, как сделать не швах.


 
Styx   (2014-04-03 15:17) [12]


> KSergey ©   (03.04.14 14:57) [11]
> Расскажите, как сделать не швах.

Для этого нужно по крайней мере понять, чего хочется добиться. Иначе, как обычно, XYZ.


 
ТНЕ картман   (2014-04-03 15:52) [13]


> понять, чего хочется добиться

это самое простое: поддержка системы, начавшей создаваться 15 лет назад международным коллективом студентов(с ротацией сотрудников 50%/полгода), понятия не имевших, что в итоге должно получиться.


 
_oxffff   (2014-04-03 21:49) [14]


> KSergey ©   (03.04.14 14:57) [11]
> Расскажите, как сделать не швах.
>
>


:)


 
ухты   (2014-04-04 10:25) [15]

что-бы что-то продать ненужное надо купить ненужное а у нас денег нет..
вощем, как автор и говорит, тут кроме метра колючей проволоки ничего хорошего не выйдет, посему

> Styx   (03.04.14 15:17) [12]
+1


 
jack128_   (2014-04-04 12:38) [16]


>  Но беда в том, что вызвать метод из события - весьма затратная
> процедура (затратна подготовка аргументов)

Почему бы не передавать в эти обработчики Lazy<T> ?


 
KSergey ©   (2014-04-07 15:05) [17]

> Styx   (03.04.14 15:17) [12]
> Для этого нужно по крайней мере понять, чего хочется добиться.

Что именно вам не понятно в [0]? Предметно.


 
KSergey ©   (2014-04-07 15:11) [18]

> jack128_   (04.04.14 12:38) [16]
> Почему бы не передавать в эти обработчики Lazy<T> ?

Я не знаю что это такое, но врятли в обработчики что-то можно передать.

Система простая: есть unmanaged приложение, которое умеет подгружать DLL-ки и дергать в них функции.
Хочется научиться эти DLL-ки делать на C#. Само по себе подъёмно, но хотелось бы эффективности именно в указанной части  -- подготовке аргументов. Т.к. возможных функций штук 40, почти в каждую заезжает структура на пару...тройку десятков параметров грубо говоря.

Все функции реализовывать - смысла нет. Но и - на сколько я понимаю - в C# нарисовать "частично реализованный объект" возможности нет. Вот и хотелось бы тут заэкономить.


 
картман ©   (2014-04-07 15:47) [19]


>  KSergey ©   (07.04.14 15:11) [18]
>
> > jack128_   (04.04.14 12:38) [16]
> > Почему бы не передавать в эти обработчики Lazy<T> ?
>
> Я не знаю что это такое

http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F


 
Styx   (2014-04-07 19:35) [20]


> KSergey ©   (07.04.14 15:05) [17]
> > Styx   (03.04.14 15:17) [12]
> > Для этого нужно по крайней мере понять, чего хочется добиться.
>
>
> Что именно вам не понятно в [0]? Предметно.

Непонятен X. Изложенное в [0] - это уже Y.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.002 c
2-1383979843
Вова
2013-11-09 10:50
2014.11.16
Работа с указателями не получается


2-1384614419
Macho
2013-11-16 19:06
2014.11.16
базы данных


15-1397257511
Германн
2014-04-12 03:05
2014.11.16
С днем космонавтики всех!


15-1396970740
Hp2000
2014-04-08 19:25
2014.11.16
Drivers


15-1394183038
Eleon
2014-03-07 13:03
2014.11.16
Интрнет-трафик





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский