我有一个我构建的类库,它包含许多从单个基类继承的类。
在基类上定义了一个名为Process的虚方法,它基本上将类结构的内容处理到应用程序中。
应用程序的不同组件(服务器)之间存在消息传递,它们传递和接收基类类型的消息,然后调用Process()
我遇到困难的是,我需要能够覆盖应用程序其他部分的Process()方法,即在不同的程序集中,而不从中派生另一种类型。
从我所看到的这似乎不可能,所以看看是否使用接口可以解决问题?
编辑:
我在问题中没有提到的是基类的每个派生类需要具有不同的Process()实现,具体取决于该类所需的功能。
例如:
class First : BaseClass
{
override void Process()
{
//do something
}
}
class Second : BaseClass
{
override void Process()
{
//do something else
}
}
覆盖过程方法中的代码需要位于不同的程序集中,因为此代码将基于其所属的类引用其他外部源,而不希望在整个应用程序中传播。< / p>
为了澄清,我确实有权访问,如果需要可以更改库类。
我一直在做进一步的阅读,看起来使用代表可以解决这个问题..想法?
答案 0 :(得分:6)
接口,特别是策略模式可以解决您的问题。
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
可以在任何地方定义,包括不同的程序集,它只需要实现公共接口。