当Base类具有带参数的构造函数时,如何使用固有的空构造函数

时间:2016-02-11 18:49:51

标签: c# constructor filehelpers

即。我有一个类Box,其属性长度,高度,宽度和构造函数“Box(int witdth,int height,int length)”。有一个固有的类ProductBox与属性名称。 我还有一个.csv文件,我用FileHelpers库解析到ProductBox,所以我的构造函数是空的。 现在我不能从Box中使用ProductBox,因为Box没有空构造函数,而在FileHelpers中构造函数是空的。有没有办法从Box中存储ProductBox?

class Box
{
    int Width;
    int Height;
    int Length;

    public Box(int width, int height, int length)
    {
        this.Width = width;
        this.Height = height;
        this.Length = length;
    }
}

class ProductBox : Box
{
    string Name;
    int Width;
    int Height;
    int Length;
    public static ProductBox[] GetInfo(string filePath)
    {
        var engine = new FileHelperEngine<ProductBox>();
        var result = engine.ReadFile(filePath);
        return result;
    }
}

3 个答案:

答案 0 :(得分:2)

没有

如果基类提供参数化构造函数,则除非重新定义基类以使其也具有无参数构造函数,否则不能在派生类中提供无参数构造函数。这些价值来自哪里?

如果你的基数实际上是struct,那么由于struct定义的默认无参数构造函数,它是可能的。

您可以按照hl3mukkel的描述链接构造函数,其中派生类传递构造的值。你也可以这样做:

class ProductBox : Box
{
    string Name;

    public ProductBox()
        :base(0,0,0)
    {
    }
}

如果您想自己提供默认值。

答案 1 :(得分:1)

是的,如果它继承了它,你可以做构造函数链接

public class Box 
{
    int Width;
    int Height;
    int Length;

    public Box(int width, int height, int length)
    {
        this.Width = width;
        this.Height = height;
        this.Length = length;
    }
}

public class ProductBox : Box
{
    string Name;

    public ProductBox(string Name, int width, int height, int length)
        : base(width, height, length)
    {
        this.Name = Name;
    }

    public static ProductBox[] GetInfo(string filePath)
    {
        var engine = new FileHelperEngine<ProductBox>();
        var result = engine.ReadFile(filePath);
        return result;
    }
}

答案 2 :(得分:1)

从设计的角度来看,我认为你的做法是错误的。虽然您可能能够一起破解某些东西来解决构造函数问题,但您正在尝试将Box类用于两个不兼容的用途。相反,你应该有两个单独的类。

FileHelpers是一个用于描述csv文件的库,以便您可以轻松导入它们。您应该有BoxFileSpec来描述您的文件。它实际上不是一个合适的C#类 - 它可能有:虚拟字段来表示未使用的列;许多属性[FieldNullValue][FieldQuoted][FieldConverter];它最适用于公共字段(FileHelpers限制,而不是C#最佳实践)等。它是用于描述导入文件的便利语法。它应该包含任何逻辑或特殊构造函数。

然后你可以拥有一个干净的最佳实践Box类,它具有你的专门构造函数和其他逻辑,属性,方法等等。

然后使用FileHelperEngine<BoxFileSpec>将记录读入数组并将其映射到Box的可枚举(通过Linq或类似AutoMapper的库)。

类似的东西:

/// A 'real' class. Add methods, getters, setters, whatever.
/// FileHelpers doesn't use this class.
class Box
{
    public int Width { get; set; }
    public int Height { get; set; }
    public int Length { get; set; }

    public Box(int width, int height, int length)
    {
        this.Width = width;
        this.Height = height;
        this.Length = length;
    }
}

/// A 'real' class. Add methods, getters, setters, whatever.
/// FileHelpers doesn't use this class.
class ProductBox : Box
{
    public ProductBox(int width, int height, int length) 
        : base(width, height, length)
    { }

    public int Name { get; set; }
}

/// This is the class FileHelpers will use
/// This class describes the CSV file only. Stick to whatever
/// syntax conventions are required by FileHelpers.
[DelimitedRecord(";")]
class ProductBoxFileSpec
{
    [FieldQuoted(QuoteMode.OptionalForRead)]
    public int Width;
    [FieldQuoted(QuoteMode.OptionalForRead)]
    public int Height;
    [FieldQuoted(QuoteMode.OptionalForRead)]
    // Handle non-US formats such as , decimal points
    // convert from inches to centimetres? 
    // you get the idea...
    [FieldConverter(MyCustomizedLengthConverter)] 
    public int Length;
    [FieldOptional]
    public string SomeDummyExtraCSVColumn;
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<ProductBoxFileSpec>();
        var productBoxRecords = engine.ReadFile(filePath);
        var productBoxes = productBoxRecords
            .Select(x => new ProductBox(x.Width, x.Height, x.Length) { Name = x.Name });
    }
}