0

以下のコードに従って、ブラシの1つのインスタンスの詳細を新しいインスタンスにコピーしたいと思います。

private static Brush CopyBrush(Brush b)
        {
            Brush b1 = new Brush();

            // code to copy settings from b to b1

            return b1;
        }

私の難しさは、Brushが抽象クラスであるため、インスタンス化できないことです。私はBrushから継承するいくつかの異なるクラスを持っており、それらのいずれかをこのメソッドに渡すことができます。継承するクラスはすべてBrushで同じプロパティを使用するため、それらをコピーしても問題はありません。リターンは、呼び出し元で継承タイプにキャストバックできます。

4

3 に答える 3

1

すべての派生クラスに特定のシグネチャを持つコンストラクターがあることが保証されている場合(引数なしなど)、インスタンスに基づいてそれぞれのサブタイプをインスタンス化できTypeます。

Brush b1 = (Brush)Activator.CreateInstance(b.GetType());

それが保証されないBrush場合は、現在のクラスの新しいインスタンスを作成するために、クラスに仮想メソッドを導入する必要があります。サブクラスはそれをオーバーライドして、適切なコンストラクターを呼び出すことができます。

より具体的には、Brushクラスは次のメソッドを持つことができます。

protected virtual Brush CreateBrushInstance()
{
    return (Brush)Activator.CreateInstance(GetType());
}

異なるコンストラクター引数を必要とする派生クラスでは、このメソッドをオーバーライドし、適切な引数値を使用してActivator.Create(Type, object[])メソッドを呼び出します。

CopyBrush(これは、それがクラスのメソッドであることを前提としていBrushます。それ以外の場合は、メソッドの使用internalまたはpublic可視性CreateBrushInstance。)

于 2012-08-25T21:12:08.930 に答える
1

ケース1:すべてのBrush派生クラスにはパブリックデフォルトコンストラクターがあり、すべてのプロパティにはパブリックセッターがあります。

この場合、1つの一般的な方法で十分です。

static TBrush Copy<TBrush>(this TBrush brush) where TBrush : Brush, new()
{
    return new TBrush() // <- possible due to the `new()` constraint ^^^
           {
               TypeOfHair = brush.TypeOfHair,
               NumberOfHairs = brush.NumberOfHairs,
               …
           };
}

ケース2:上記の前提条件の1つ以上が満たされていない。つまり、パブリックのデフォルトコンストラクタがないか、少なくとも1つのプロパティがパブリックに設定できません。

次のパターンを使用できます。

abstract class Brush
{
    protected abstract Brush PrepareCopy();
    // replacement for public default ctor; prepares a copy of the derived brush
    // where all private members have been copied into the new, returned instance.

    public Brush Copy()
    {
        // (1) let the derived class prepare a copy of itself with all inaccessible
        //     members copied:
        Brush copy = PrepareCopy();

        // (2) let's copy the remaining publicly settable properties:
        copy.TypeOfHair = this.TypeOfHair;
        copy.NumberOfHairs = this.NumberOfHairs;

        return copy;
    } 
}

sealed class FooBrush : Brush
{
    public FooBrush(int somethingPrivate)
    {
        this.somethingPrivate = somethingPrivate;
        // might initialise other members here…
    }

    private readonly int somethingPrivate;

    protected override Brush PrepareCopy()
    {
        return new FooBrush(somethingPrivate);
    }
}
于 2012-08-25T21:12:45.220 に答える
-1

クローンメソッドを試してください

http://msdn.microsoft.com/fr-fr/library/system.drawing.brush.clone%28v=vs.90%29.aspx

于 2012-08-25T21:06:29.733 に答える