Как сгенерировать шаблон Программы, сгенерировав абстрактный класс - PullRequest
0 голосов
/ 15 марта 2012

У меня следующая проблема.

Первым шагом является реализация программы, которая следует определенному протоколу при запуске. Следовательно, будут необходимы функции, такие как onInit, onConfigRequest и т. Д. (Они запускаются, например, входящим сообщением через порт TCP)

Моя цель - создать класс, например абстрактный, который имеет абстрактные функции как onInit () и т. Д. Программист должен просто наследовать от этого базового класса и просто переопределить эти абстрактные функции базового класса.

Остальное по протоколу, например должны быть просто обработаны в фоновом режиме (с использованием кода базового класса) и не должны появляться в коде программистов.

Какова правильная стратегия проектирования для таких задач? и как мне разобраться, что статический метод main не наследуется? Каковы ключевые теги для этой проблемы? (У меня проблема с поиском решения, поскольку у меня нет четких формулировок по этой проблеме)

Цель состоит в том, чтобы создать какую-то библиотеку / класс, который, включенный в код, приводит к выполнению исполняемых файлов в соответствии с протоколом.

РЕДАКТИРОВАТЬ (новое объяснение):

Хорошо, позвольте мне попытаться объяснить более подробно:

В этом случае программы должны быть клиентами в архитектуре клиент-сервер. У нас есть соединение клиент-сервер по TCP / IP. Каждая программа должна следовать определенному протоколу при запуске программы:

Как только моя программа запускается и подключается к серверу, она получает сообщение инициализации (TcpClient), когда это происходит, она должна вызвать функцию onInit (). (Должно ли это быть реализовано системой событий?) После onInit () сообщение подтверждения должно быть отправлено на сервер. После этого есть несколько других шагов, например, сообщение конфигурации от сервера, которое вызывает onConfig и так далее. Давайте сосредоточимся на функции onInit.

Идея состоит в том, что onInit (и onConfig и т. Д.) Должны быть единственными функциями, которые должен редактировать программист, в то время как общий обмен сообщениями протокола для него скрыт. Поэтому я подумал, что использование абстрактного класса с абстрактными методами onInit (), onConfig () должно быть правильным. Статический класс Main я хотел бы скрыть, так как внутри него, например, будет какая-то часть, которая подключается к порту tcp, который реагирует на сообщение инициализации и вызывает функцию 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();
}

Я надеюсь, вы поняли идею сейчас! Программист должен впоследствии наследовать от этого мастер-класса и просто должен редактировать функции onInit и т. Д.

Возможен ли этот путь? Как? Что еще вы порекомендуете для решения этой проблемы?

EDIT: Идея стратегии, представленная ниже, является хорошей! Прочтите мой комментарий по этому поводу.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Взгляните на это, Шаблон разработки стратегии , это может помочь. Пример короткого кода ниже:

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 #, но я уверен, что много примеров в Интернете).

2 голосов
/ 16 марта 2012

То, что вы описываете, это шаблон дизайна шаблона. Ваш абстрактный клиент содержит подробную информацию о протоколе и делегирует подклассам через защищенные методы шаблона / ловушки, чтобы позволить конкретному клиенту настроить поведение.

// 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, которые вы явно не открываете.

0 голосов
/ 15 марта 2012

Ну, вы уже приняли правильное решение в choosinhg abstract class. Хорошо, что вы можете определить abstract methods, какой потребитель (который унаследовал от него) должен переопределить, а также иметь "нормальные" методы с кодом в нем. Таким образом, вы создаете ограничения для производного типа, чтобы реализовать несколько наборов функций и, плюс, предоставить ему общий набор функций, который будет иметь любой производный тип по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...