C#中具有多个构造函数的抽象类
本文关键字:构造函数 抽象类 | 更新日期: 2023-09-27 18:21:15
我有一个Command
class
,我想将其解析为字符串/from字符串,并将其作为UDP
消息发送。基类看起来很简单:
public abstract class Command
{
public Command() {}
public abstract override string ToString();
public abstract void FromString(string str);
}
从这里我得到类似classes
的
public class NetCommand : Command
{
public string details;
public NetCommand() {};
public override string ToString() {return details;}
public override void FromString(string str) {details = str; }
}
或者更复杂的MovementCommand : Command
,包含被解析的x
、y
、z
、doubles
等等
如何在采用string
并使用FromString
方法的基础class
中添加构造函数?对于所有派生类都将有相同的精确代码,并且看起来像:
public Command(string str)
{
this.FromString(str);
}
并且每个CCD_ 13将使用其自己的CCD_。
但我已经不懂语法了,有什么帮助吗?
这正是您所要求的,包括对抽象类的更改
public abstract class Command
{
public Command() { }
public Command(string str)
{
FromString(str);
}
public abstract override string ToString();
public abstract void FromString(string str);
}
public class NetCommand : Command
{
public string details;
public NetCommand() {}
public NetCommand(string str) : base(str) { }
public override string ToString() { return details; }
public override void FromString(string str) { details = str; }
}
我理解您的方式是,您希望有一个基类构造函数来创建子类对象。你不能那样做。
您可以在基类上创建一个静态工厂方法,该方法基于给定的字符串创建具体对象,例如
public abstract class Command
{
public Command() {}
public abstract override string ToString();
public abstract void FromString(string str);
public static Command FromString(string str){
Command command;
if(/*string indicates it is a NetCommand*/){
command = new NetCommand();
command.FromString(str);
}
}
}
有一个后备字段,用于存储通过构造函数传递的值,然后有两个虚拟方法来设置和返回该值。注意,在下面的实现中,NetCommand
只能用非参数构造函数实例化。
public abstract class Command
{
private string _details;
protected Command()
{
}
protected Command(string details)
{
_details = details;
}
public new virtual string ToString()
{
return _details;
}
public virtual void FromString(string details)
{
_details = details;
}
}
public class NetCommand : Command
{
public NetCommand(string str) : base(str)
{
}
}
我建议这个实现(将尽可能多的代码放入基类中,以便于进一步创建类)
public abstract class Command {
protected Command(): this(null) {
}
protected Command(String details) {
Details = details;
}
// I'd rather convert it into property
public String Details {
get;
set; // may be "private set" will be better here
}
public override string ToString() {
return Details;
}
// TODO: think on delete or redesign this method:
// Redundant: Details provide all the functional required
// Bad name: "FromString" usually means create/return
// instance by given details
// public static Command FromString(string details)
public virtual void FromString(String details) {
Details = details;
}
}
...
public class NetCommand: Command {
public NetCommand(string details) : base(details) {
}
}
扩展Domysee的答案,使用通用的工厂方法,您可以执行以下操作:
public abstract class Command
{
protected Command() {}
public abstract override string ToString();
protected abstract void FromString(string str);
public static T FromString<T>(string str) where T: Command, new()
{
var command = new T();
command.FromString(str);
return command;
}
}
现在,只要派生的Command有一个默认的构造函数,就可以使用Command.FromString创建它的实例,如下所示:
var command = Command.FromString<NetCommand>("command string");