在不同的程序集中定义覆盖方法

本文关键字:集中 定义 覆盖 方法 程序集 程序 | 更新日期: 2023-09-27 18:11:35

我已经构建了一个类库,它由许多从单个基类继承的类组成。

在基类上定义了一个名为Process的虚拟方法,它本质上是将类结构的内容处理到应用程序中。

在应用程序的不同组件(服务器)之间传递消息,它们传递和接收基类类型的消息,然后调用Process()

我被卡住的地方是,我需要能够在应用程序的其他部分重写Process()方法,即在不同的程序集中,而不从中派生另一种类型。

从我所读到的这似乎是不可能的,所以看看是否使用接口会解决这个问题?

编辑:

我在问题中没有提到的是,基类的每个派生类都需要根据该类所需的功能具有不同的Process()实现。

例如:

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

重写过程方法中的代码需要在不同的程序集中,因为这些代码将引用基于它所属的类的其他外部源,我不想在整个应用程序中传播。

只是为了澄清,我确实有访问权限,如果需要,可以更改库类。

我一直在做一些进一步的阅读,似乎使用委托可以解决这个问题。想法吗?

在不同的程序集中定义覆盖方法

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

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可以在任何地方定义,包括不同的程序集,它只需要实现公共接口。