C# 是否可以在不修改派生类的情况下重写虚方法?

C# 是否可以在不修改派生类的情况下重写虚方法?,c#,C#,我有一个dll文件,其中包括从基类继承的各种派生类,这个基类有一个名为“Run”的虚拟方法,在派生类中没有重写的“Run”方法。现在,方法Run的行为在特定情况下会发生变化,我想应用于所有派生类,所以如果我想改变该行为,通常我必须创建各种自定义派生类,这些派生类继承自派生类并重写“Run”方法。如果派生类的数量很多,并且会导致重复的源,那么这将是一个负担。注意,我没有修改该dll文件中任何现有内容的许可证 dll文件: public abstract class Animal { pub

我有一个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");
    }
}
客户端正常:

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()”方法?

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

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

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

然后,您可以只分配希望它在运行时调用的内容。您尝试执行的是.Net中不允许的“多重继承”


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

您的意思是
base.Run()
?我不明白您的意思。如果你想让狗和猫有特定的行为,你需要实施特定的行为。泛型run方法应该如何做特定的事情?谢谢,这是我的意图。@Cid你读过这个问题吗?@J.vanLangen谢谢,但正如我所说,我没有编辑现有源代码的许可,我所能做的就是在客户端实现。这会如何影响从
Animal
继承的另一个类的行为?我以为他想在不创建多个驱动类的情况下更改Run()方法的功能。也许我误解了他的问题。已经有一些类是从
Animal
派生出来的,他不控制这些类,但必须使用它们。@Rotem但我认为这个解决方案是可以调整的。因此dll提供了
Dogs
Cat
作为“API”,所以OP可以使用上述模式从它们派生出来。由于代码重复,因此不理想。但在我或其他人不能想出更好的办法之前,我想这将是最好的。只是我会使用CTOR注入来实现“运行行为”。@Fildor这是OP中已经描述过的解决方案。整个问题是关于避免这种解决方案。我很好奇,你认为多重继承在这里有什么帮助?我们需要在狗和动物之间注入其他行为:在不改变狗和动物的情况下改变运行(),因此,我们需要从Dogs和另一个类继承CusTomDogs,后者重写Animal.Run()。我们可以用代理模式来实现,但是Phong Dao说我们有很多CusTomDogs、CusTomCat等等,但是您仍然需要继承所有您想要更改的子类,因此您的情况并不比OP中的解决方案好多少。我想您确实在每个子类中保存了一行代码,必须重写
Run
方法。