Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.11.16;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
15-1397053687
Ламо777
2014-04-09 18:28
2014.11.16
Кто знает форумы по работе с клеточными автоматами?


15-1397147091
Лактоза
2014-04-10 20:24
2014.11.16
не работает встраиваемый ютуб


15-1396983279
Ghost del vonte
2014-04-08 22:54
2014.11.16
Магия Delphi 2007


4-1270297417
tippa
2010-04-03 16:23
2014.11.16
Вот есть PostMessage и SendMessage


15-1396171437
KSergey
2014-03-30 13:23
2014.11.16
С# и проверка абстрактных методов