2016-01-29 65 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