У меня есть небольшая проблема с наследованием делегатов. Насколько я понимаю, делегат - это указатель на пару: экземпляр и метод, дело в том, что этот метод используется при создании делегата и не подвержен наследованию. Итак, это не сработает:
public class BaseObject {
public delegate void del();
public BaseObject() {
next=Method;
}
public del next;
public void ExecuteNext() {
next();
}
public virtual void Method() {
Debug.Log("BASE");
}
}
public class InheritedObject:BaseObject {
override public void Method() {
Debug.Log("INHERITED");
}
}
...
(new InheritedObject()).ExecuteNext();
Execute запускает базовый метод (), я хочу, чтобы он запускал унаследованный метод (). Я нашел способ обойти, но он неэффективен, отвлекает и очень подвержен ошибкам, в любом случае вот текущая рабочая версия, от которой я хотел бы избавиться:
class BaseObject {
public delegate void del();
BaseObject() {
next=DoMethod; /// using DoMethod here
}
public del next;
public void ExecuteNext() {
next();
}
public void DoMethod() { /// using DoMethod here
Method();
}
public virtual void Method() {
// do base
}
}
class InheritedObject:BaseObject {
override public void Method() {
// do inherited
}
}
...
(new InheritedObject()).Execute();
Этот подход к DoMethod работает, но имеет много проблем,
- много бесполезного кода
- ошибка при использовании класса - легко ошибиться obj.next =
DoMethod
с obj.next = Method
- Ошибка при наследовании класса - я должен помнить, чтобы не наследовать DoMethod, а также множество виртуальных и переопределений.
Какие-нибудь предложения, как я могу сделать это лучше? Возможно, какая-то магия аннотаций, которая сама по себе делает DoMethod
? Я уже думал о словарях - они здесь не очень хороши, они добавляют еще один уровень путаницы (Mono, .NET 2, Unity3d framework)