2016-01-29 63 views
0

我有两个类ProductExtendedProductExtendedProduct来源于Product类。在ExtendedProduct类中还有一些字段。将子类转换为父类

问题是,当我将ExtendedProduct转换为Product时,我的Product对象具有ExtendedProduct所具有的字段。

我只是想转换ExtendedProductProduct类没有任何ExtendedProduct类的字段出现在Product类。

+1

将'ExtendedProduct'的属性映射到'Product'的新实例 –

+2

代码将有助于解释这种现象... – Ian

+1

这违反了[多态性](https://en.wikipedia.org/wiki/ Polymorphism_%28computer_science%29)!唯一的方法是在'Product'类中创建一个接受'ExtendedProduct'对象作为参数的构造函数。 – erikscandola

回答

4

只要你的ExtendedProduct是一个Product把它铸造到后者不会改变铸造实例的任何东西,因为你引用了同一个对象。因此,您需要一个全新的Product实例,例如通过使用拷贝构造函数:

class Product { 
    public Product(Product p) { 
     this.MyProp = p.MyProp; 
    } 
} 

现在你可以调用这个样:

var product = new Product(myExtended); 

然而,这听起来很奇怪我。为什么你想要“删除”扩展属性呢?你需要先前提供的所有额外信息。你可以简单地转换为父类不提供这些特性都:

var p = (Product) myExtendedProduct; 

现在虽然p实际上是ExtendedProduct一个实例,你只能从Product访问属性。这是多态性的基本原理。

+1

我猜OP会在下一步序列化实例,这就是为什么他不想要不必要的属性/字段。 –

0

我想你想:

ExtendedProduct product = new ExtendedProduct(); 
Product p = product; 

如果你不能确定的转换,你总是可以做到这一点:

ExtendedProduct product = new ExtendedProduct(); 
Product p = product as Product; 

这是详细here

0

你可以写延期ExtendedProduct类和处理您的映射那里:

public static Product ToProduct(this ExtendedProduct extProduct) 
{ 
    var product = new Product(); 
    product.par1 = extProduct.Par1; 
    // ... 

    return product; 
} 

,然后调用它像这样:

var myExtProduct = new ExtendedProduct(); 
var product = myExtProduct.toProduct(); 
0

您还可以添加一个方法,返回基地为类的基的基类。

Public Class Base 
{ 
    Public Base GetBase() 
    { 
     return (Base)this; 
    } 
} 

现在,如果这个基类是继承的。您可以从中调用该方法并返回Base类。

+0

这对于简单地执行'(Product)myExtended'提供了什么值? – HimBromBeere

+0

这两个作品。这只是另一种选择。 – Parrish