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

时间:2012-03-15 15:13:22

标签: c# design-patterns abstract

我有以下问题。

第一步是实现一个程序,该程序在启动时遵循特定协议。 因此,需要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等函数。

这种方式可行吗?怎么样? 您还有什么建议来解决这个问题?

编辑: 下面提供的战略意识是好的!看看我的评论。

3 个答案:

答案 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哪个消费者(从谁继承)必须覆盖,并且还有“普通”方法,其中包含代码。通过这种方式,您可以为派生类型创建约束以实现多组函数,并为其提供默认情况下任何派生类型将具有的一组公共函数。