0

次のフィールドを持つ次のオブジェクトがあります。

class ObjectA
{
    float progress;
    bool isDone;
}

class ObjectB
{
    bool canceled;
}

ObjectCにバインドされ、フィールド、ObjectAおよびを持っているものを作成したいと思います。ObjectBprogressisDonecanceled

どうすればそのようなことができますか?

dynamicこれは、タイプまたはいくつかのインターフェイス+ ClassWrapperコンボを介して可能ですか?

ObjectAタイプ、ObjectBクラス、署名などは変更できません。それらはそのまま与えられます。

4

4 に答える 4

2

クラスのマルチベース継承のようなものはc#にはありません。このようなことを行う最も良い方法は、各動作のインターフェースを宣言することです。

interface IA
{
    float Progress {get;}
    bool IsDone {get;}
}

interface IB
{
    bool IsCanceled{get;}
}

そしておそらく前の2つを集約するために3番目:

interface IC : IA , IB
{
}

両方を1つのクラスに実装します。

class C : IC
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
    public bool IsCanceled { get; set; }
}

次に、クラスではなくインターフェイスに対してプログラミングすることを忘れないでください。

class SomeClass
{
  //If only IA features are required
  void DoSTH(IA c){}
}
于 2012-08-13T11:45:10.200 に答える
0

ObjectAフィールドはプライベートであり、およびの外部のコードにはアクセスできないため、通常の方法では必要なことはできませんObjectB

それを行う唯一の方法は、カプセル化を壊すため、まったくお勧めしませんが、リフレクションを使用してこれらのメンバーにアクセスすることです。

于 2012-08-13T12:40:47.383 に答える
0

あなたは作曲を介してそれを行うことができます:

public class ObjectC
{
    public ObjectA ProgressInfo { get; set; }

    public ObjectB CanceledInfo { get; set; }
}

またはインターフェイス経由:

public interface IProgressable
{
    float Progress { get; }

    bool IsDone { get; }
}

public interface ICancelable
{
    bool Canceled { get; }
}

次に、新しいクラスに両方のインターフェイスを実装させることができます。

public class ObjectC : IProgressable, ICancelable
{
    ...
}
于 2012-08-13T11:45:14.087 に答える
0

multiple inheritanceC#でサポートされていないを探しています。

1つの解決策はインターフェイスを使用することですが、コードを複数回実装する必要があります。

public interface IFoo1
{
    float Progress { get; set; }
    bool IsDone { get; set; }
}

public interface IFoo2
{
    bool Canceled { get; set; }
}

public abstract class ObjectA : IFoo1
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
}

public abstract class ObjectB : IFoo2
{
    public bool Canceled { get; set; }
}

public class ObjectC : IFoo1, IFoo2
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
    public bool Canceled { get; set; }
}
于 2012-08-13T11:47:38.223 に答える