C# 如何通过生成抽象类来生成程序模板
我有以下问题 第一步是实现一个程序,该程序在启动时遵循特定的协议。 因此,onInit、onConfigRequest等功能是必需的。 (例如,通过TCP端口上的传入消息触发) 我的目标是生成一个类,例如AbstractOne,它具有抽象函数onInit(),等等。 程序员应该只继承这个基类,而只重写基类的这些抽象函数 协议的其余部分(例如)应在后台简单处理(使用基类的代码),不需要出现在程序员代码中 对于此类任务,正确的设计策略是什么?我如何处理静态main方法不可继承的问题?这个问题的关键标签是什么?(我在寻找解决方案时遇到问题,因为我对此问题缺乏明确的说明) 目标是创建某种类型的库/类,这些库/类包含在代码中,生成符合协议的可执行文件 编辑(新解释): 好的,让我试着更详细地解释一下: 在这种情况下,程序应该是客户机-服务器体系结构中的客户机。 我们有一个通过TCP/IP的客户机-服务器连接。在程序启动时,每个程序都需要遵循特定的协议: 一旦我的程序启动并连接到服务器,它就会收到一条Init消息(TcpClient),当这种情况发生时,它应该触发函数onInit()。 (这应该由事件系统实现吗?)在onInit()之后,应该向服务器发送确认消息。之后还有一些其他步骤,例如,来自服务器的配置消息触发onConfig等。让我们集中讨论onInit函数 这个想法是,onInit(和onConfig等)应该是程序员应该编辑的唯一函数,而整个协议消息对他来说是隐藏的。 因此,我认为在抽象类中使用抽象方法onInit()、onConfig()应该是正确的。我想隐藏的静态主类,因为在它里面,例如,将有一些部分连接到tcp端口,它对Init消息作出反应,并调用onInit函数。 这里有两个问题: 1.静态主类不能被继承,不是吗? 2.我不能从抽象主类中的主类调用抽象函数 让我举一个伪例子来说明我的想法:C# 如何通过生成抽象类来生成程序模板,c#,design-patterns,abstract,C#,Design Patterns,Abstract,我有以下问题 第一步是实现一个程序,该程序在启动时遵循特定的协议。 因此,onInit、onConfigRequest等功能是必需的。 (例如,通过TCP端口上的传入消息触发) 我的目标是生成一个类,例如AbstractOne,它具有抽象函数onInit(),等等。 程序员应该只继承这个基类,而只重写基类的这些抽象函数 协议的其余部分(例如)应在后台简单处理(使用基类的代码),不需要出现在程序员代码中 对于此类任务,正确的设计策略是什么?我如何处理静态main方法不可继承的问题?这个问题的关键标
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等函数
这条路可行吗?怎么用?
对于解决这个问题,您还有什么建议
编辑:
下面提供的ideo策略很好!查看我的评论。好吧,在选择Hg
抽象类时,您已经做出了一个很好的决定。它的好处在于,您可以定义抽象方法
,消费者(从中继承的)必须覆盖这些方法,并且还可以使用包含代码的“普通”方法。通过这种方式,您可以为派生类型创建一个约束,以实现多个函数集,另外,还可以为它提供一组公共函数集,默认情况下,任何派生类型都将具有这些函数集。好吧,在选择Hg抽象类时,您已经做出了一个很好的决定。它的好处在于,您可以定义抽象方法
,消费者(从中继承的)必须覆盖这些方法,并且还可以使用包含代码的“普通”方法。通过这种方式,您可以为派生类型创建一个约束,以实现多个函数集,另外,还可以为它提供一组公共函数集,默认情况下,任何派生类型都将具有这些函数集。看看这个,它可能会有所帮助。下面是一个简短的代码示例:
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中实现这一点,但我确定web上有许多示例)。看看这个,它可能会有所帮助。下面是一个简短的代码示例:
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#中实现这一点,但我确定web上有许多示例).您所描述的是模板设计模式。您的抽象客户端包含协议细节,并通过受保护的模板/挂钩方法委托给子类,以允许Concert客户端自定义行为
// 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对象的任何内部结构。您所描述的是模板设计模式。您的抽象客户端包含协议细节,并通过受保护的模板/挂钩方法委托给子类,以允许Concert客户端自定义行为
// 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对象的任何内部。我不完全理解您的任务。请写更详细的例子说明你的目标。我不完全理解你的任务。请写更详细的例子,你的目标。谢谢。我来看看这个。这个现在可以用了!酷!尽管用户需要复制上面的main类,并将自己的特定处理策略添加到C#项目中,但仍然是这样。他是否可以编写特定的ProcessingStrategy,并使用库中提供的MainClass的主函数将其编译为可执行文件?如何做到这一点?我的目标是用户只需要实现一个类(SpecificProcessingStrategy)。当做我不知道如何从C#(最熟悉Java)的库中运行Main,但我确信这是可能的。几个