私は、次のようなインターフェイスとクラス構造を使用するシステムで作業しています。
interface ILw // a lightweight interface definition
class Medium : ILw
class FullA : Medium // full class definitions
class FullB : Medium
class LwA : ILw // lightweight class definitions
class LwB : ILw
システム内で、完全または軽量の可能性があるオブジェクトに遭遇したため、ILwインターフェイスを必要とする関数があります。この設計で遭遇する問題は、オブジェクトの完全バージョンと軽量バージョンの間で共有する必要があるデータとメソッドが、ILwで定義されているよりも多いことです。だから私は自分が次のようなことをする必要があることに気づきました:
if (myvar is FullA)
{
(myvar as FullA).MyFunction()
}
else
{
(myvar as LwA).MyFunction()
}
ここで、MyFunction()はFullAとLwAごとに個別に実装され、同一のデータ構造で機能する可能性があります。このコードの重複をなくしたい。
私の C++ バックグラウンドでは、多重継承の典型的なケースのようです。つまり、どちらも必要とするデータとメソッドに対してクラスSharedAを定義し、それをFullAとLwAの親リストに追加します。しかし、C# とインターフェイスの世界でこれを考えるのに役立つガイダンスが必要です。この問題を解決するために受け入れられたパターンはありますか?
ありがとうございました。
アップデート:
これまでに寄せられたコメントの助けを借りて、1) 共有データの集計を必要とする中間インターフェイスと、2) このデータを操作するメソッドの拡張クラスを使用して、より良い設計にリファクタリングすることができました。理想的には、これら (データとメソッド) は同じ構造に結合されます。mate-in-1 がボード上にあるように感じますが、表示されません。
public interface ILwBase { }
class Medium : ILwBase { }
public class LwDataA
{
static private int _count = 0;
public int id;
public LwDataA() { id = ++_count; }
}
public interface ILwA : ILwBase
{
LwDataA ExtData { get; }
}
public static class ExtLwA
{
public static void MyFunction(this ILwA o)
{
Console.WriteLine("id = " + o.ExtData.id);
}
}
class LwA : ILwA
{
private LwDataA _extData = new LwDataA();
public LwDataA ExtData { get { return (_extData); } }
}
class FullA : Medium, ILwA
{
private LwDataA _extData = new LwDataA();
public LwDataA ExtData { get { return (_extData); } }
}
class Program
{
static void Main()
{
ILwA a1 = new FullA();
ILwA a2 = new LwA();
a1.MyFunction();
a2.MyFunction();
}
}
これにより、LwA と FullA の間でわずか 2 行の重複コードで必要なものが可能になります。また、集計プロパティ (私の以前の編集) を介して呼び出したり、集計の周りにラッパーを実装したりする必要がなくなります。
うまくいけば、これは私が達成しようとしていることを明確にします。これが最善の解決策ですか?