Конкретный пример
Есть ли способ решить эту проблему?Я имею в виду использование делегата, чтобы гарантировать, что method2 вызывается после method1 или чего-то подобного.-
Пятно включено.Но я думаю abstract
.Специфика ваших общих потребностей может привести к этому в любом случае.Но мы должны также добавить еще один комментарий в микс:
Более высокий уровень абстракции может "исправить" это.
Большая картинка
- Открытый метод Login () (для клиентского кода), который ...
- Вызывает LoginAttempted () и LoginValid () по порядку.
- Далее, эти 2 под-метода:
abstract
(могут быть делегатами) - Таким образом, код клиента может вызывать только Login () и ...
- Вход в системуреализации могут настраивать как эти функции входа в систему и ...
- их порядок вызовов постоянен.
BTW, имея заменяемые методы в упорядоченном списке методовзвонки это шаблон дизайна шаблона .
Этот пример на C # (надеюсь, он работает!)
public abstract class LogOnBase {
// add comments here so we know what these are supposed to do
protected abstract void LogInValid(string, string);
protected abstract void LogInAttempted (string, string);
public bool Logon(string userName, string Password) {
LogInAttempted (userName, Password);
LogInValid (userName, Password);
}
}
// concrete implementation
public class LogOnConcrete : LogOnBase {
protected override void LoginValid (string UName, string PW) {
// do concrete stuff
}
protected override void LogInAttempted (string UName, string PW) {
// do concrete stuff
}
}
// Using the LogOn class
public class LogOnExample {
string whoAmI;
string passWord;
LogOnConcrete LogMeIn;
public LogOnExample (string me, string pw) {
whoAmI = me;
passWord = pw;
}
public static void Main (string[] args) {
LogOnExample driver = new LogOnExample (bubba, mySecretPW);
LogMeIn = new LogOnConcrete();
LogMeIn.Logon(driver.whoAmI, driver.passWord);
}
}