是否有一种模式或结构可以保证子类在其生命周期的某个阶段将调用某些方法?
我正在寻找类似类似的东西,当一个类实现某个接口时,它实质上是说它承诺实现某些方法。
反模式?我知道这可能实际上是某种反模式。我基本上需要进行健全性检查,即子类集合正在完成他们应该做的工作。如果不存在,我只需编写一个迷你文件解析器,它会快速检查方法是否被调用。
这个问题与语言无关,但在这种情况下,我正在使用C#
答案 0 :(得分:5)
你的问题不是100%明确,但我认为第一句是你真正想要的:
是否有保证子类的模式或结构, 在它的生命周期的某个阶段,要么叫某些 方法,或发送某些消息?
我对此一无所知。
您可以创建基类abstract
,强制所有子类通过生成方法abstract
来实现某些方法,并根据基类中的对象状态和生命周期实现调用。从基类调用这些abstract
方法将从子类调用它们的实现。
答案 1 :(得分:4)
我不明白怎么会有一个。子类可以做任何想做的事情。您应该在基类中实现这些特定方法调用以确保它们,并使它们成为非虚拟方法,以便它们甚至不能被覆盖。如果将事件放在界面中,可以实现类似的功能。您不能保证实施者会触发它们,但如果它们被触发,它们会呼叫到您想要的任何地方。
答案 2 :(得分:4)
我不认为这是可能的,仅仅是设计。我的意思是,一个超类对它的子类一无所知,所以我不知道它是怎么回事。
现在,当您谈到生命周期时,您可能有某种start()
和stop()
方法?如果是这样,为什么不在超类中使用另一个方法,比如说finalCheck()
不能在子类中重写并且检查你的方法是否被调用,可能只是使用了一些bool
类字段。我知道这不能保证任何东西,但至少可以在运行时检查它。
在任何情况下,没有任何进一步的信息,它只是需要重新设计的东西。例如,而不是:
abstract class Parent {
void mustDo1() { }
void mustDo2() { }
abstract void do() { }
}
class Child : Parent {
override void do() {
base.mustDo1(); // force ?
// something custom
base.mustDo2(); // force ?
}
}
试着想出这样的事情:
abstract class Parent {
void mustDo1() { }
void mustDo2() { }
void do() {
this.mustDo1();
this.customDo();
this.mustDo2();
}
abstract void customDo() { }
}
class Child : Parent {
override void customDo() {
// something custom
}
}
答案 3 :(得分:3)
你不能保证任何方法都会调用特定的方法,并且建议你尝试重新设计你的系统,这样就不需要了......但是如果你必须做的话你可以做些事情来清楚地说明他们需要的未来程序员:
在许多情况下,您可以实现虚拟方法,这些方法在派生类需要执行某些操作时(例如序列化某些数据)在算法的适当时刻调用。基类通常可以提供可在大多数情况下使用的默认实现,因此派生类只需偶尔覆盖这些方法。或者方法可以是抽象的或抛出异常以强制派生类实现它。使用这种方法可以得到控制的反转,因此基类告诉派生类该做什么以及何时做。
提供了为您调用这些必需方法的辅助方法,因此编写派生类的程序员只需要调用DoImportantThingNow(),而不必编写3行或4行代码。 - 这样可以更容易记住拨打电话,更容易接听电话,更容易看出这段代码对于系统的正确操作非常重要。
将验证码添加到您的bsse类。它可能能够检查某些方法是否在预期时被调用,并且如果派生类没有保留其讨价还价的一部分,则抛出异常。
添加好的文档注释,以便明确覆盖虚拟方法时的预期结果。
基本上,如果你需要另一个程序员来做一些特殊的扩展你的代码,你需要让它变得简单和万无一失。
答案 4 :(得分:3)
不,那不可能,主要原因是超类对其子类一无所知