- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
abstract class A { }
abstract class B
{
void CallValidate(A objA)
{
MethodInfo info = base.GetType().GetMethod("Validate", new[] { objA.GetType() });
if (info == null)
{
throw new ApplicationException("The method 'Validate' with parameter type '" + objA.GetType() + "' is not implemented.");
}
info.Invoke(this, new object[] { objA });
}
}
Метод CallValidate базового класса проверяет наличие метода "Validate" с нужной сигнатурой в своих дочерних классах и вызывает его, если таковой есть, иначе - кидает исключение.
vse_govno 02.04.2013 14:00 # −1
Guid 02.04.2013 14:57 # −1
taburetka 02.04.2013 14:05 # 0
Guid 02.04.2013 15:11 # 0
abstract class A { ... }
class A1 : A { ... }
class A2 : A { ... }
class A3 : A { ... }
...
abstract class B
{
void CallValidate(A objA) { ... }
void Validate(A1 a) { ... }
void Validate(A2 a) { ... }
}
...
B validator;
validator.CallValidate(new A3()); // бросит исключение, т.к. в B не определен метод "void Validate(A3 a) { ... }"
neeedle 02.04.2013 15:53 # +1
Это как это вы так хитро инстанцировали абстрактный класс?
Guid 03.04.2013 06:30 # 0
mangyst 02.04.2013 14:58 # −1
someone 02.04.2013 17:41 # −1
Или даже проще - передавать аргументом делегата и прямо при вызове Register подсовывать ему лямбду, если в .NET делегаты могут быть дженериками.
neeedle 02.04.2013 18:54 # 0
И все.
not implemented exeption там есть.
Dummy00001 02.04.2013 22:52 # +2
roman-kashitsyn 02.04.2013 22:59 # +1
neeedle 03.04.2013 04:33 # 0
roman-kashitsyn 03.04.2013 07:49 # +1
neeedle 03.04.2013 10:44 # 0
Но с яваскриптом не связал.
Yuuri 04.04.2013 00:01 # 0
neeedle 04.04.2013 06:44 # 0
Yuuri 04.04.2013 11:58 # 0
neeedle 04.04.2013 15:18 # 0
Смысл говнокода в том, что для таких вещей существует интерфейс.
Ccik 04.04.2013 10:00 # 0