gpt4 book ai didi

c# - 在多个类中依次调用同一个重写方法

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:30 26 4
gpt4 key购买 nike

我有一个基类 C1提供了几个方法的默认实现 C2和很多自定义实现 Cx (+20) 看起来像这样:

abstract class C1
{
public abstract void M1();
}

abstract class C2 : C1
{
// other overridden members ...

// M1(); has no default implementation yet.
}

class Cx : C2
{
public override void M1()
{
// ...
}
}

现在,我想链接 C2.M1Cx.M1因为我需要添加一个新的通用功能。通常我会创建一个新的抽象方法并由第二个 base 类调用它,如下所示:

abstract class C1
{
public abstract void M1();
}

abstract class C2 : C1
{
// M1 should get a default implementation
// and then M1 in the next derived class should be called
public override void M1()
{
// ...
M1Internal();
}

protected abstract void M1Internal();
}

class Cx : C2
{
protected override void M1Internal()
{
// ...
}
}

但是,我有超过 20 个这样的类并且更新它们是一项大量的工作所以我想知道是否有另一种方法可以让我覆盖 M1在两个C2Cx并按此顺序调用它们 C1.M1()然后Cx.M1()无需创建新的中间 辅助方法。这种情况有更好的模式吗?

最佳答案

我认为在这种情况下最好使用装饰器模式。尽可能使用组合而不是继承。

abstract class C1
{
public abstract void M1();
}

class Cx : C1
{
public override void M1()
{
// ...
}
}

class CxWithCommonBehavior : C1
{
C1 realObject;

public CxWithCommonBehavior(C1 realObject)
{
this.realObject = realObject;
}

public override void M1()
{
// common behavior
realObject.M1();
}
}

请注意,对于所有派生的 Cx 类,您只需要一个 CxWithCommonBehavior 类 - 您在构造函数中传递装饰实例。

通过这种方式,您可以添加更多行为,以所有可能的方式链接它们,甚至可以在运行时添加或删除它们

关于c# - 在多个类中依次调用同一个重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56830548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com