- 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" с нужной сигнатурой в своих дочерних классах и вызывает его, если таковой есть, иначе - кидает исключение.
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) { ... }"
Это как это вы так хитро инстанцировали абстрактный класс?
Или даже проще - передавать аргументом делегата и прямо при вызове Register подсовывать ему лямбду, если в .NET делегаты могут быть дженериками.
И все.
not implemented exeption там есть.
Но с яваскриптом не связал.
Смысл говнокода в том, что для таких вещей существует интерфейс.