C# 如何在不同的程序集中定义重写方法

5
我有一个类库,其中包含多个继承自单个基类的类。
基类中定义了一个虚方法Process,它将处理类结构的内容并将其传递给应用程序。
应用程序的不同组件(服务器)之间进行消息传递,它们传递和接收基类类型的消息,然后调用Process()方法。
我遇到的问题是需要在应用程序的其他部分中覆盖Process()方法,而不需要从另一个类型派生。根据我所读的,这似乎不可能,因此考虑使用接口是否可以解决该问题?
编辑:
我在问题中没有提到的是,基类的每个派生类都需要根据该类所需的功能具有不同的Process()实现。
例如:
class First : BaseClass
{
  override void Process()
  {
    //do something
  }
}

class Second : BaseClass
{
  override void Process()
  {
    //do something else
  }
}

由于这些代码会基于其所属的类参考其他外部来源,我不希望将此代码在整个应用程序中传播,因此重写过程方法中的代码需要位于不同的程序集中。

仅为澄清,如果需要,我可以访问并更改库类。

我已经进行了进一步阅读,似乎使用委托可以解决此问题..您有什么想法?


为什么不能从那个类派生?如果您想使用接口,您还需要触及库类。我猜您也不被允许这样做。 - ntohl
1
所以,你的问题基本上是如何覆盖一个不是你基类的类中的方法? - Zohar Peled
1个回答

7

接口,特别是策略模式可以解决您的问题。

public interface IProcessStrategy
{
    void Process();
}

public class ProcessService
{
    public void DoProcess( IProcessStrategy strategy )
    {
        ...whatever
        strategy.Process();
        ...whatever else
    }
}

通过将处理过程分离为自己的抽象,您可以创建多个策略,并且从技术上讲,无论策略是在相同的程序集中定义还是在不同的程序集中定义都没有关系。
更新:我想我最终知道你在做什么了,我的建议是拥有一个可以注入但仍具有默认实现的接口。
public interface IProcessStrategy
{
    void Process();
}

public class BaseClass
{
    private IProcessStrategy _strategy;

    public void Process()
    {
        // this is where the real "override" happens
        if ( _strategy == null )
        {
            // default implementation
            ...
        }
        else
            // overridden
            _strategy.Process();
    }

    public void OverrideWith( IProcessStrategy strategy )
    {
        this._strategy = strategy;
    }

你使用它的方式:
 BaseClass f = new BaseClass();
 f.Process(); // uses the default implementation

还有其他地方

 BaseClass f = new BaseClass();
 IProcessStrategy p = new First();

 // override
 f.OverrideWith( p );
 f.Process(); // overridden with a new implementation

请注意,被覆盖的实现,即First可以在任何地方定义,包括不同的程序集,只需实现公共接口即可。

谢谢您,这似乎回答了我的问题,唯一的问题是我在问题中忽略了一个关键部分。我已经更新了。 - GreatSamps
读了你的评论几次,仍然无法确定它是否改变了我的答案。我猜你的描述还是有点模糊。 - Wiktor Zychla
我想我真正的问题是如何为类First和Second定义不同的进程方法。从您的示例中我所理解的是,对于调用First.Process()和Second.Process()两者都将调用相同的方法。 - GreatSamps
我在接口方面有点薄弱,所以我猜我只是缺少一些细节来完成这个例子。您介意向我展示如何将其应用于我之前添加的代码示例吗?非常感谢您迄今为止的帮助。 - GreatSamps
啊,好的,我现在明白混淆出现的地方了。所以我上面给出的例子都将在同一个程序集中,它本质上是一个消息传递库,用于在两个其他应用程序之间进行通信。我想做的是能够在应用程序1中定义First或Second的Process()方法内容,然后在应用程序2中为First或Second的Process()方法定义不同的内容。背后的原因是我不想将每个应用程序的所有依赖项都暴露给App1和App2。我得出的结论是这是不可能的,我只能接受它。 - GreatSamps
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接