通常,您应该始终更喜欢对象组合而不是类继承。这意味着,与其创建一个WorkClass
具有您需要的大部分功能的超类(例如 ),然后创建两个从它继承的具体子类(例如AWorkClass : WorkClass
和BWorkClass : WorkClass
)并使用/覆盖这些功能,您应该创建两个具体的没有继承(AClass
和BClass
)的类“有”WorkClass
作为成员变量。
更进一步,最后试图回答你的问题,听起来你想实现策略模式,它允许你非常轻松地切换“策略”(比如在同步和异步通信之间),并允许你添加新的“策略”无需太多努力(或对现有策略进行修改而不必担心连锁反应)。
这是用 C# 实现的示例策略:
namespace Your.App
{
//correct implementation of the Strategy Pattern
interface ICommunication
{
void Send();
}
class SyncCommunication : ICommunication
{
public void Send() { /*your sync code*/ }
}
class AsyncCommunication : ICommunication
{
public void Send() { /*your async code*/ }
}
public class WorkClass
{
ICommunication Strategy { get; set; }
public WorkClass()
{
UseAsync = false;
}
bool _useAsync;
public bool UseAsync
{
get { return _useAsync; }
set
{
_useAsync = value;
if(_useAsync)
Strategy = new AsyncCommunication();
else
Strategy = new SyncCommunication ();
}
}
public void Send()
{
Strategy.Send();
}
}
}
要将其与第一段联系起来,然后像这样使用 WorkClass:
namespace Your.App
{
//correct implementation of the Strategy Pattern
public class MyWorkContext
{
WorkClass Worker {get; set;}
public MyWorkContext()
{
Worker = new WorkClass();
}
public void SendMyData()
{
if(someConditionIsMet)
Worker.UseAsync = true;
else
Worker.UseAsync = false;
Worker.Send();
}
}
}
您可以看到您的用户WorkClass
(MyWorkContext
在这种情况下)对您的策略一无所知,也不应该知道。它只是告诉工人足以让其知道该做什么,然后工人知道它需要使用哪种策略来完成它。策略本身是唯一知道工作实际如何完成的策略,这对于测试和维护非常有用。