解析和存储类

时间:2016-04-23 20:28:32

标签: c# parsing

我有一个类来存储继承" Item"字典中的类。我有几个相互继承的类,

示例:

Item <- Commodity <- Weapon

这些类只是容器,它们没有特定的方法只有构造函数,它们只保存信息。

在ItemManager类中,我有一个方法可以传递表示文本文件名称的字符串(没有格式)。使用该格式我还知道通过为该方法将分割线作为数组来解析将该行中的行解析为类实例的方法。

如何制作它以便在那些处理项目的方法中我不必编写重复的字段分配?

示例:

在从数组生成项目的方法中我有tmpItem.id=int.parse(line[0]),在生成武器的方法中我有tmpWeapon.id = int.parse(line[0])

我这样做错了吗?如何有效地将一行文本解析为一个知道继承关系的对象(考虑调用基础构造函数的构造函数)。

2 个答案:

答案 0 :(得分:0)

很高兴您意识到您正在复制解析代码并想要修复它。

如果所有类都继承自Item类,则将公共属性移动到此类中并从此处解析它。例如。

public abstract class Item
{
  public int id { get; set; }

  public virtual void ParseId(string line)
  {
    id = int.Parse(line);
  }
}

现在所有继承的类都具有相同的解析方法,并且可以使用它,但这样就可以删除重复。

这是我提出的最简单的例子。我想接下来你想要一种方法可以解析一切并设置这些属性,但我不知道你的策略是什么。但请记住,如果你想删除重复,那么最简单的方法是将代码移到基类中(虽然它不是最好的情况,但我认为你现在不需要担心它。

更新:阅读完评论后,我已将代码更改为以下内容。它可能对你有所帮助

public abstract class Item
{
    public int id { get; set; }
    public string name { get; set; }
    public float volume { get; set; }
    public float minPrice { get; set; }
    public float mass { get; set; }
    public string description { get; set; }

    public virtual void Parse( string[] entries )
    {
        int i = 0;
        id = int.Parse( entries[ i++ ] );
        name = entries[ i++ ];
        minPrice = float.Parse( entries[ i++ ] );
        volume = float.Parse( entries[ i++ ] );
        mass = float.Parse( entries[ i++ ] );
        description = RemoveTabs( entries[ i ] );
    }

    public string RemoveTabs( string line ) { throw new NotImplementedException(); }
}

public class Commodity : Item
{
}

public class Weapon : Commodity
{
}

public class CommodityC : Item
{
}


public class ItemManager
{

    private Item ProcessCommodity( string[] entries )
    {
        var commodity = new Commodity();
        var weapon = new Weapon();

        commodity.Parse( entries );
        //weapon.Parse( entries );
        return commodity;
    }
}

答案 1 :(得分:0)

创建构造函数,将文件内容拆分为行并调用基础构造函数:

public class Base
{
    public const int LinesCount = 1;
    public Item(string[] lines)
    {
        Id = int.Parse(lines[0]);
    }

    public int Id { get; }
}

public class Inherited : Base
{
    public Inherited(string[] lines) : base(lines)
    {
        int index = base.LinesCount;
        OtherProperty = int.Parse(lines[index++]);
    }

    public int OtherProperty { get; }
}

修改 添加了每班更改行数的解决方案