2010-02-15 34 views
3

寫一個asp.net的MVC應用程序,我有這樣的事情......我如何複製從對象im繼承的對象im試圖複製?

Public Class AA 
'... has some variables... 
End Class 

Public Class BB 
Inherits AA 
Public ExtraVariable As Integer ' just adds another variable and thats it! 
End Class 

所以,現在在我的計劃,我只是想AA類的對象複製到BB型的空變量?

這樣做很有意義,因爲我期望AA類型對象中的所有字段都被複制到新創建的BB類型對象中,並且BB類型對象中的ExtraVariable我將(只)將值賦給它在我自己的時間後(複製後)!

我知道複製BB類型爲AA類型不合適,因爲會丟失數據!

但即時嘗試將AA複製到BB,我用DirectCastCType來做到這一點,我一直在「無法投」錯誤!

注:我使用vb.net(但可以讀取C#,沒有問題)

回答

1

由於匿名說,你可能想AA傳遞到BB的構造,在那裏你可以複製所有元素:

public class AA 
{ 
//some variables 
} 

public class BB : AA 
{ 
    public BB(AA aa) 
    { 
    //Set BBs variables to those in AA 
    someVariable= aa.someVariable 
    } 

    public int SomeExtraProperty{get;set;} 
} 

但很明顯,你必須提供給你,你可以重用,如果適當的任何繼承構造。

編輯

基於上面的一些評論,你也可以這樣做:

public class BB : AA 
{ 
    private AA _aa; 
    public BB(AA aa) 
    { 
    //Set BBs variables to those in AA 
    _aa=aa; 
    } 

    public int SomeExtraProperty{get;set;} 

    //override inherted members and just delegate to the internal object 
    public override int SomeMethod() 
    { 
     return _aa.SomeMethod(); 
    } 
} 

或可能去爲Decorator Pattern

+0

感謝隊友,進一步澄清它。 – 2010-02-15 21:43:24

5

好像你混淆複製簡單的任務。

你可能想要做的是在BB上定義一個構造函數,它將AA作爲參數並複製這些值。

+1

不久,感謝您的回覆,我只想澄清,你是說我複製的所有成員在AA到BB在構造函數? 像,如在田間,所以如果我有5個變種在AA,然後分配這些5個變種基本上線? – 2010-02-15 21:34:04

+1

是的,您可能需要爲每個成員編寫一行代碼。但是,請注意,您可以調用任何基類構造函數,這可能最終會爲您執行大量工作。 – 2010-02-15 21:36:10

+0

哦,重新分配和賦值之間的區別,通過賦值,你是指通過引用分配一些東西,而不是真正的值(真正的複製) – 2010-02-15 21:44:51

1

我不認爲你正在嘗試的是可能的。派生類的引用必須實際指的是派生類

的實例看Is it possible to assign a base class object to a derived class reference with an explicit typecast in C#?.

這裏得到的值的一種方式

 public class AA 
     { 
      public string name; 
     } 
     public class BB : AA 
     { 
      public BB(AA aa) 
      { 
       name = aa.name; 
      } 
     } 
+0

?那麼它不可能呢?你必須逐場做? – 2010-02-15 21:32:36

+0

好的,我很害怕這個。我想不是繼承,我只需要BB類,公共課AA作爲BB類的變量!這聲音猶太教? – 2010-02-15 21:41:25

+0

這可能是您的模塊的設計,需要注意 – 2010-02-15 21:52:08

0

看來你誤會了正確的繼承概念。

當您將BB複製到AA時,您不會錯過任何數據,因爲如果您將它重新投射到BB,您可以獲取數據。

AA不能直接投射到BB,因爲AA不是BB。如果你願意,你可以做一個自定義的演員,你可以指定演員將如何。

但是,這樣做豈不會很直觀,就是好「手」把價值:

bb.Value1 = aa.Value1 
bb.Value2 = aa.Value2 
bb.Value3 = aa.Value3 

沒什麼壞處。

+0

複製(不是通過引用,而是通過值)在一個鏡頭中,BB到AA將意味着丟失的數據(ExtraVariable將會丟失),因爲AA不會分配它。糾正我,如果我錯過了什麼?另外,我的回答的第二部分,你是否稱讚我必須幾乎複製每個變量一個接一個? – 2010-02-15 21:37:49

+0

@ Erx_VB.NExT.Coder:你錯過了很多。如果我把BB放入AA之後,我再把AA放到BB,數據又回來了。所以這意味着你不會錯過任何事情,你只需要將它投射到你想要的特定類型。 – 2010-02-15 21:41:43

+0

但我指的是COPYING BY VALUE不是Copy Reference by Reference,在我剛剛給你的例子中。你的建議是不可能的。但我明白如果是通過參考,那麼你所說的是正確的。 – 2010-02-15 21:48:14

0

上有對象了一些好的帖子克隆您可能希望看一看,例如Deep cloning objects,但是人們已經在這裏提到的關於手動複製的內容可能是從一種類型複製到另一種類型的最佳選擇。

你的問題似乎在你的理解繼承和鑄造。一些鑄造時,請注意裸露的是,你可以很容易地垂下來一個簡單的類型,但反之則是有很多麻煩,而且不可能用一個簡單的投

與類:

public class BaseObject 
{ 

} 

public class InheritedObject : BaseObject 
{ 

} 

public class BaseObjectConsumer() 
{ 
    Consumer(BaseObject base); 
} 

public class InheritedObjectConsumer() 
{ 

} 

下,應考慮:

InheritedObject io = new InheritedObject(); 
BaseObject bo = new BaseObject(); 

BaseObjectConsumer(io); //this is possible as the InheritedObject is being 'viewed' as a BaseObject 

InheritedObjectConsumer(bo); //Not as simple, as the Base object is not necessarily an Inherited object, so we can't cast 'up'