2017-02-07 4 views
0

以下のコードを仮定します。既存の基本クラスのインスタンスを使用して派生クラスを作成することは可能ですか?または、拡張メソッドをここで最善の方法で使用していますか?派生クラスは、C#で既存の基本クラスへの参照を保持することはできますか?

public class TestThis 
{ 
    public void Test1() 
    { 
     A a = GetAFromExternalSystem(); 

     B b = new B(a); 

     a.Value = 5; 

     b.Value == 5; //want this line to return true. In other words, b to hold a reference to a. 
    } 

    private A GetAFromExternalSystem() 
    { 
     return new A(); 
    } 
} 

public class A 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

public class B : A 
{ 
    public B(A a) 
    { 
     this = a; //Cannot assign to 'this' because it is read-only 
    } 
    public int Ranking { get; set; } 
} 
+1

可能な複製を使用して行うことができるものを達成するには、[それはC#で明示的な型キャストを持つ派生クラス参照に、基本クラスのオブジェクトを割り当てることは可能ですか? ](http://stackoverflow.com/questions/729527/is-it-possible-to-assign-a-base-class-object-to-a-derived-class-reference-with-a) – weir

+0

_derived class using既存の基底クラスのインスタンス_あなたが言っていることを理解すれば、これは誤解です。サブクラスは親**クラス**から継承します。 **オブジェクト**からではありません。 – chadnt

答えて

3

は、ここでは、一般的にこれを行うだろう方法です。あなたはそれがどのように動作するかについての質問がある場合、は、新しい、正確で明確な質問を投稿します。

ここでは、これはAの更新がBも更新するという性質を持っていません。その奇妙なことをする方法は、BとAの間のis-a-kind-ofの関係を放棄することです:

public class B 
{ 
    private A a; 
    public B(A a) 
    { 
     this.a = a; 
    } 
    public int Ranking { get; set; } 
    public int Value 
    { 
     get { return this.a.Value; } 
     set { this.a.Value = value; } 
    } 
    public string Name 
    { 
     get { return this.a.Name; } 
     set { this.a.Name = value; } 
    } 
} 

あなたはAに延期B、そしてまたB Aのインスタンスであることの両方を持つようにしたい場合は今、あなたは難しい問題を抱えています。 Aのプロパティは仮想でなければならず、Bで上書きされます。私はそれを練習として残します。

しかし、本当にあなたはここで何か非常に奇妙なことをしようとしているように聞こえます。あなたが実際に解決しようとしている問題を説明できますか?オッズはあなたが間違っていることはかなり良いです。

+0

OPはあなたが '継承'と '合成'のパターンを示したことを知っているべきでしょうか? – Aybe

+0

特定の問題は、Microsoft Wordのタスクペインアドインをテストすることです。 –

+0

私のテストクラスには、タスクペインに含まれるHTMLLIElementClassオブジェクトのIHTMLElementCollectionによって設定されたアクセサプロパティがあります。そのコレクションは動的です。タスクペインに変更が加えられた場合、そのコレクション(プロパティからアクセスされたとき)はそれらの変更を反映します。たとえば、コレクションの数が正しく、位置プロパティなどの個々のHTMLLIElementClassプロパティが正しいとします。 –

2

いいえ、できません。

派生クラスが作成されるとき、基本クラスはでもが作成され、派生クラスの「一部」です。派生クラスの基本部分を他のものに単純に再割当てすることはできません。

修正はかなり簡単ですが、気になるメンバーをコピーするだけです。

public class A 
{ 
    public A(string name, int value) 
    { 
     this.Name = name; 
     this.Value = value; 
    } 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

public class B : A 
{ 
    public B(A a) : this(a.Name, a.Value, 0) 
    { 
    } 
    public B(string name, int value, int ranking) : base(name, value) 
    { 
     this.Ranking = ranking; 
    } 
    public int Ranking { get; set; } 
} 

研究は慎重にこの、あなたはそれがどのように動作するかを理解しておいてください:

0

これは派生クラスでは実行できませんが、X/Y Problemである可能性があります。あなたのテストケースで達成しようとしているラッパークラスの

public class TestThis 
{ 
    public void Test1() 
    { 
     A a = GetAFromExternalSystem(); 

     B b = new B(a); 

     a.Value = 5; 

     b.Value == 5; 
    } 

    private A GetAFromExternalSystem() 
    { 
     return new A(); 
    } 
} 

public class A 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

public class B // B acts as a 'wrapper' for A 
{ 
    public B(A a) 
    { 
     this.A = a; 
    } 
    public A A { get; set; } 
    public int Value { 
     get { return A.Value; } 
    } 
    public int Ranking { get; set; } 
} 
関連する問題