C# 子类是否有一种模式保证它将调用某些方法?

C# 子类是否有一种模式保证它将调用某些方法?,c#,inheritance,interface,C#,Inheritance,Interface,是否有一种模式或结构可以保证子类在其生命周期的某个阶段调用某些方法 我在寻找类似于类实现某个接口的东西,本质上是说它承诺实现某些方法 反模式?我知道这实际上可能是某种反模式。我基本上需要检查一组子类是否正在做他们应该做的工作。如果什么都不存在,我只需编写一个小型文件解析器,它将快速检查方法是否被调用 这个问题与语言无关,但在本例中,我使用的是C#你的问题不是100%清楚,但我假设第一句话是你真正想要的: 是否有一种模式或结构可以保证子类, 在其生命周期的某个阶段,它将调用 方法,还是发送某些消息

是否有一种模式或结构可以保证子类在其生命周期的某个阶段调用某些方法

我在寻找类似于类实现某个接口的东西,本质上是说它承诺实现某些方法

反模式?我知道这实际上可能是某种反模式。我基本上需要检查一组子类是否正在做他们应该做的工作。如果什么都不存在,我只需编写一个小型文件解析器,它将快速检查方法是否被调用


这个问题与语言无关,但在本例中,我使用的是C#

你的问题不是100%清楚,但我假设第一句话是你真正想要的:

是否有一种模式或结构可以保证子类, 在其生命周期的某个阶段,它将调用 方法,还是发送某些消息

我对此一无所知


您可以使基类
抽象
,通过使方法
抽象
强制所有子类实现某些方法,并根据基类中的对象状态和生命周期实现调用。从基类调用这些
abstract
方法将从子类调用它们的实现。

我不明白为什么会有这样的方法。子类可以做它想做的任何事情。当然,您应该在基类中实现这些特定的方法调用,并将它们设置为非虚拟的,以便它们甚至不能被重写。如果在界面中放置事件,可以实现类似的效果。你不能保证实现者会触发它们,但如果它们被触发,它们会在你想去的任何地方发出呼叫。

我认为这是不可能的,仅仅是出于设计。我的意思是,一个超类对它的子类一无所知,所以我不明白这是怎么回事

现在,当您谈到生命周期时,可能有一些
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或4行代码,只需调用DoImportantThingNow();-这使您更容易记住进行调用,更容易正确调用,更容易看出这段代码对系统的正确操作很重要

  • 向bsse类添加验证代码。它可以检查某些方法是否在预期的情况下被调用,如果派生类没有保留其部分,则抛出异常

  • 添加好的文档注释,以明确重写虚拟方法时的预期内容


本质上,如果你需要另一个程序员做一些特殊的事情来扩展你的代码,你需要使它尽可能简单和简单。

不,这是不可能的,主要原因是超类对其子类一无所知

听起来像是你想要的是一些单元测试。@MarcinJuraszek我试图澄清问题atad@Ghopper21是的,也许这就是我需要看到的。我在Unity3D框架内工作,不确定它的支持程度。顺便说一句,我想Unity3D刚刚发布了一个集成测试框架。值得一看。给你:酷。我很高兴答案是“不,不可能”