0

私が達成しようとしていることを言葉で正確に説明できないかもしれませんが、このサンプルコードは次のことができると思います。

class A
{
    public string Name
    {
        get;
        set;
    }
    public virtual void Say()
    {
        Console.WriteLine("I am A");
        Console.Read();
    }

    public bool ExtendA;

    public A GetObject()
    {
        if (ExtendA)
            return new B();

        return this;
    }
}

internal class B : A
{
    public override void Say()
    {
        Console.WriteLine(string.Format("I am {0}",Name));
        Console.Read();
    }
}

class Program
{
    static void Main(string[] args)
    {          
       var a = new A() {ExtendA = true,Name="MyName"};
        A ab = a.GetObject();            
    } 
}

上記のコードのように、フィールドExitend Aがtrueに設定されていて、同じオブジェクトのインスタンスから同じタイプのオブジェクトを取得しようとすると、オブジェクトが取得されますが、プロパティ'Name'の値が失われます。

Aのプロパティを持つクラスBをどのように戻すことができますか?

ありがとう

4

2 に答える 2

5

デザインパターンに関する本やその他のリソースを読むことをお勧めします。このためには、ファクトリパターンを使用します。

AクラスとクラスAFactoryに加えて、基本クラスとクラスがありB : AますBFactory

実行時に、インスタンス化するものを選択します:ファクトリを使用してAまたはB:

IFactoryファクトリ=iWantClassA?new AFactory():new BFactory(); A a = factory.CreateInstance();

@ArnaudFには同意しますが、あなたが何を達成しようとしているのかわかりません。サブクラスBを直接作成してみませんか?

アップデート:

問題を読み直してみると、次のように、クラスにコピーコンストラクタが本当に必要なようです。

public class A {
    public A() {
        // Default constructor
    }
    public A(A other) {
        // Copy-constructor. Members of other will be copied into this instance.
    }
}

public class B : A {
    public B() {

    }
    public B(A other) : base(other) { // Notice how it calls the parent class's copy-constructor too
    }
}

次に、実行時にAのインスタンスをBのインスタンスに「アップグレード」するには、コピーコンストラクターを使用します。

A a = new A();
// some logic here
B upgradedA = new B( a );
于 2012-06-21T14:45:33.913 に答える
1

あなたの最終的な目的はわかりませんが、知らない場合に備えて、ExpandObjectタイプを知ってもらいたいと思います。

これにより、次のコードが示すように、実行時にプロパティとメソッドをオブジェクトに動的に追加できます。

using System;
using System.Dynamic;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic expando = new ExpandoObject();

            expando.Name = "Name";  // Add property at run-time.
            expando.PrintName = (Action) (() => Console.WriteLine(expando.Name)); // Add method at run-time.

            test(expando);
        }

        private static void test(dynamic expando)
        {
            expando.PrintName();
        }
    }
}
于 2012-06-21T15:03:10.873 に答える