如何通过生成抽象类来生成程序模板

本文关键字:程序 抽象类 何通过 | 更新日期: 2023-09-27 18:28:07

我有以下问题。

第一步是实现一个程序,该程序在启动时遵循特定的协议。因此,onInit、onConfigRequest等功能将是必要的。(这些是由TCP端口上的传入消息触发的)

我的目标是生成一个类,例如抽象类,它具有onInit()等抽象函数。程序员应该只继承这个基类,而应该只覆盖基类的这些抽象函数。

例如,协议的其余部分应该在后台简单处理(使用基类的代码),不需要出现在程序员代码中。

此类任务的正确设计策略是什么?我该如何处理静态主方法不可继承的问题?这个问题的关键标签是什么?(我在寻找解决方案时遇到了问题,因为我对这个问题缺乏明确的说明)

目标是创建某种库/类,这些库/类包含在一个代码中,导致可执行文件遵循协议。

编辑(新解释):

好的,让我试着解释更详细的:

在这种情况下,程序应该是客户端-服务器体系结构中的客户端。我们通过TCP/IP建立了客户端-服务器连接。每个程序在程序启动时都需要遵循一个特定的协议:

一旦我的程序启动并连接到服务器,它就会收到一条Init消息(TcpClient),当这种情况发生时,它应该触发函数onInit()。(这应该由事件系统实现吗?)在onInit()之后,应该向服务器发送一条确认消息。然后还有一些其他步骤,例如来自服务器的配置消息,它会触发onConfig等等。让我们专注于onUnit函数。

这个想法是,onInit(和onConfig等等)应该是程序员唯一应该编辑的函数,而整个协议消息对他来说是隐藏的

因此,我认为使用一个带有抽象方法onInit()、onConfig()的抽象类应该是正确的。我想隐藏的静态Main类,因为在它里面,例如,会有一些部分连接到tcp端口,它对Init消息做出反应,并调用onInit函数。这里有两个问题: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();
}

我希望你现在就明白了!之后,程序员应该继承这个主类,只需要编辑onUnit等函数

这条路可能吗?怎样你还推荐什么来解决这个问题?

编辑:下面提供的战略构想很好!看看我对此的评论。

如何通过生成抽象类来生成程序模板

看看这个,战略设计模式,它可能会有所帮助。下面是一个简短的代码示例:

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的名称(本例中为SpecificProcessingStrategie),并动态加载它(我不知道如何在C#中做到这一点,但我相信网上有很多例子)。

您所描述的是Template设计模式。抽象客户端包含协议详细信息,并通过受保护的模板/钩子方法委托给子类,以允许conceet客户端自定义行为。

// 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对象的任何内部。

好吧,您在选择abstract class时已经做出了一个很好的决定。好的方面是,您可以定义abstract methods,哪个使用者(继承自它的使用者)必须覆盖它,并在其中包含代码的"普通"方法。通过这种方式,您可以为派生类型创建一个约束,以实现多个函数集,此外,还可以为它提供一个任何派生类型默认情况下都具有的通用函数集。