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,包含被解析的xyzdoubles等等

如何在采用string并使用FromString方法的基础class中添加构造函数?对于所有派生类都将有相同的精确代码,并且看起来像:

public Command(string str)
{  
    this.FromString(str);
}

并且每个CCD_ 13将使用其自己的CCD_。

但我已经不懂语法了,有什么帮助吗?

C#中具有多个构造函数的抽象类

这正是您所要求的,包括对抽象类的更改

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");