上传相关 - 类转换

时间:2012-01-14 23:35:13

标签: c# inheritance

我有一个班级,例如:

 class BaseDataPoint
 {
     public double A;
     public double B;
 }

以及稍后的代码中,我需要将其扩展到

 class ReportDataPoint : BaseDataPoint
 {
     public double C;
 }

由于以上仅是一个示例,并且还有更多要复制的字段,是否可以(通过一些技巧)将BaseDataPoint实例“转换为ReportDataPoint而无需逐个字段手动复制?

如果我有

 BaseDataPoint p1;
 ...
 ReportDataPoint p2=(ReportDataPoint)p1;  // FAILS at runtime
 ReportDataPoint p3=new ReportDataPoint(p1);  //  can't compile

4 个答案:

答案 0 :(得分:1)

您无法更改实例的类型;你需要创建一个新实例。此外,您不能使用强制转换语法,因为您不允许在继承链中添加自定义运算符。

因此;要么添加手动转换(通过添加像你的例子那样的构造函数,还是ComvertTo方法) - 或者有一些库可能有所帮助(也许AutoMapper,其中一些序列化lins可能也有帮助)。

答案 1 :(得分:1)

只需在ReportDataPoint中编写一个构造函数,以便p3的初始化将被编译。它可以工作,但它可以让你为新字段定义默认值。班级

BaseDataPoint
    {
        public double A;
        public double B;
        public BaseDataPoint(double A, double B)
        {
            this.A = A;
            this.B = B;
        }
    }

    class ReportDataPoint : BaseDataPoint
     {
        static const double defaultCValue = 0.0;
        public double C;
        public ReportDataPoint(double A, double B, double C)
         :base(A,B){
            this.C = C;
          }

       public ReportDataPoint(BaseDataPoint p,double C=defaultCValue) :
        this(p.A, p.B, C)
       { }
    }

    ...
    BaseDataPoint p1=new BaseDataPoint(1,2);

    ReportDataPoint p2=new ReportDataPoint(p1);

答案 2 :(得分:0)

不是我知道的。在这种情况下,我只需为ReportDataPoint实现一个接受BaseDataPoint实例并复制相关数据的构造函数。

答案 3 :(得分:0)

它仅取决于您创建的实例的类型。

如果您尝试:

BaseDataPoint p1 = new ReportDataPoint();

你以后可以投出它。

否则,您可以实现泛型util类以在实例类型之间传输字段值。一劳永逸。