即。我有一个类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;
}
}
答案 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 });
}
}