我有以下问题。
第一步是实现一个程序,该程序在启动时遵循特定协议。 因此,需要onInit,onConfigRequest等功能。 (这些是由TCP端口上的传入消息触发的)
我的目标是生成一个类,例如抽象类,它具有onInit()等抽象函数。 程序员应该只从这个基类继承,并且只应该覆盖基类的这些抽象函数。
协议的其余部分,例如应该在后台简单地处理(使用基类的代码),不应该出现在程序员代码中。
此类任务的正确设计策略是什么?以及如何处理静态主方法不可继承?这个问题的关键标签是什么? (我在寻找解决方案时遇到问题,因为我对此问题缺乏明确的陈述)
目标是创建某种类型的库/类,它包含在一些代码中 - 导致遵循协议的可执行文件。
编辑(新解释):
好的,让我试着解释更详细的内容:
在这种情况下,程序应该是客户端服务器体系结构中的客户端。 我们通过TCP / IP连接客户端服务器。每个程序在程序启动时都需要遵循特定的协议:
一旦我的程序启动并连接到服务器,它将收到一个Init消息(TcpClient),当发生这种情况时,它应该触发函数onInit()。 (这应该由事件系统实现吗?)在onInit()之后,应该向服务器发送确认消息。之后还有一些其他步骤,例如来自服务器的配置消息,触发onConfig等。让我们专注于onInit函数。
这个想法是,onInit(和onConfig等)应该是程序员应该编辑的唯一函数,而整个协议消息是为他隐藏的。
因此,我认为使用抽象方法onInit()的抽象类,onConfig()中应该是正确的。我想要隐藏的静态Main类,因为在其中,例如将有一些连接到tcp端口的部分,它对Init消息作出反应,并将调用onInit函数。 这里有2个问题: 1.静态主类不能继承,不是吗? 2.我不能在抽象主类中从主类调用抽象函数。
让我给出一个我的想法的伪示例:
public abstract class MasterClass
{
static void Main(string[] args){
1. open TCP connection
2. waiting for Init Message from server
3. onInit();
4. Send Acknowledgement, that Init Routine has ended successfully
5. waiting for Config message from server
6.....
}
public abstract void onInit();
public abstract void onConfig();
}
我希望你现在明白了! 程序员之后应该从这个masterclass继承,只需要编辑onInit等函数。
这种方式可行吗?怎么样? 您还有什么建议来解决这个问题?
编辑: 下面提供的战略意识是好的!看看我的评论。
答案 0 :(得分:2)
看看这个Strategy design pattern,它可能会有所帮助。下面是一个简短的代码示例:
class MainClass {
static void Main(string[] args) {
// Where ProcessingStrategy is your abstract class.
// SpecificProcessingStrategy is someone else's implementation.
//
ProcessingStrategy strategy = new SpecificProcessingStrategy();
// Processor is implemented and provided by you and calls the appropriate methods on the
// ProcessingStrategy..
//
Processor processor = new Processor( strategy );
processor.Process();
}
}
如果你想提供Main,那么看一下在命令行中传入具体ProcessingStrategy(在这个例子中是SpecificProcessingStrategy)的名称并动态加载它(我不知道如何做到这一点)在C#但我确信在网上有很多例子。
答案 1 :(得分:2)
您所描述的是模板设计模式。您的抽象客户端包含协议详细信息,并通过受保护的模板/钩子方法委托子类,以允许conceret客户端自定义行为。
// In your provided library
public abstract class Client
{
public void Run()
{
OpenConnection();
WaitForInitMsg();
OnInit(); // notify subclass
SendInitAckMsg();
WaitForConfigMsg();
OnConfig(); // notify subclass
SendConfigAckMsg();
// etc, etc
}
protected abstract void OnInit() {}
protected abstract void OnConfig() {}
}
// customer/client uses the functionality like this
public class ConsoleClient : Client
{
protected void OnInit()
{
Console.WriteLine("Initialized");
}
protected void OnConfig()
{
Console.WriteLine("Configured");
}
}
public class MainClass
{
static void Main(string[] args)
{
ConsoleClient client = new ConsoleClient();
client.Run();
}
}
客户永远无法访问您未明确公开的Clinet对象的任何内部。
答案 2 :(得分:0)
嗯,你已经在choosinhg abstract class
做出了一个很好的决定。好的是你可以定义abstract methods
哪个消费者(从谁继承)必须覆盖,并且还有“普通”方法,其中包含代码。通过这种方式,您可以为派生类型创建约束以实现多组函数,并为其提供默认情况下任何派生类型将具有的一组公共函数。