【问题标题】:Is possible to override virtual method without modifying derived class?是否可以在不修改派生类的情况下覆盖虚拟方法?
【发布时间】:2019-02-18 12:25:11
【问题描述】:

我有一个 dll 文件,其中包括从基类继承的各种派生类,并且该基类有一个名为“Run”的虚拟方法,并且在派生类中没有覆盖的“Run”方法。现在,方法 Run 的行为在特定情况下发生变化,我想申请所有派生类,所以如果我想改变那个行为,通常我必须创建各种自定义派生类类,这些类继承自派生类并覆盖“Run”方法.如果派生类的数量很多,会造成重复源。请注意,我无权修改该 dll 文件中现有的任何内容。

dll 文件:

public abstract class Animal
{
    public virtual void Run()
    {
        Console.WriteLine("Hello 1");
    }
}

public class Dogs : Animal
{
    //do other thing.
}

public class Cat : Animal
{
    //do other thing.
}

客户端通常:

public class CusTomDogs : Dogs
{
    public override void Run()
    {
        Console.WriteLine("Hello 2");
    }
}

public class CusTomCat : Cat
{
    public override void Run()
    {
        Console.WriteLine("Hello 2");
    }
}

是否有可能在不创建自定义每个派生类的情况下更改行为“base.Run()”方法?

【问题讨论】:

  • 你的意思是base.Run()
  • 我不明白你的意思。如果你想要狗和猫的特定行为,你当然需要实施特定的行为。通用的运行方法应该如何做任何具体的事情?
  • 谢谢,这是我的本意。
  • @Cid 你读过这个问题吗?
  • @J.vanLangen 谢谢,但正如我所说,我没有编辑现有源代码的许可,我所拥有的只是我可以在客户端实现。

标签: c#


【解决方案1】:

您正在尝试做的事情是“多重继承”,这在 .Net 中是不允许的。

您必须更改基类或更改每个继承的类。

【讨论】:

  • 我很好奇,你认为多重继承在这里有什么帮助?
  • 这里我们需要在Dogs和Animal之间注入其他行为:改变Run()而不改变Dogs和Animal,所以我们需要从Dogs和另一个类继承CusTomDogs,它会覆盖Animal.Run ()。我们可以用 PROXY 模式来做到这一点,但 Phong Dao 说比谁有很多 CusTomDogs、CusTomCat 等等
  • 但是您仍然需要从所有要更改的子类中继承,因此您不会比 OP 中的解决方案好多少。我猜你确实在每个子类中保存了一行,必须重写 Run 方法。
【解决方案2】:

您可以有一个“自定义”类,您可以在其中为 Run 方法注入所需的行为。

public class CustomAnimal : Animal
{
    public Action RunAction { get; set; }

    public override void Run()
    {
        RunAction();
    }
}

然后你可以分配你希望它在运行时调用的内容

【讨论】:

  • 这对继承自 Animal 的不同类的行为有何影响?
  • 我以为他想在不创建多个派生类的情况下更改 Run() 方法的功能。也许我误解了他的问题。
  • 已经有从Animal派生的类,他无法控制但必须使用。
  • @Rotem 但我认为可以调整此解决方案。因此 dll 提供 DogsCat 作为“API”,因此 OP 可以使用上述模式从它们派生。由于重复代码,次优。但在我或其他人无法想出更好的东西之前,我想它会尽可能好。只是我会为“RunBehavior”使用 CTOR 注入。
  • @Fildor 这就是 OP 中已经描述的解决方案。整个问题是关于避免这种解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 2018-12-17
  • 2014-07-07
  • 1970-01-01
  • 2019-05-18
  • 2012-10-26
  • 1970-01-01
相关资源
最近更新 更多