私はライブラリを書いていて、インターフェースが欲しい
public interface ISkeleton
{
IEnumerable<IBone> Bones { get; }
void Attach(IBone bone);
void Detach(IBone bone);
}
実際には、Attach() と Detach() の実装はすべての ISkeleton で同じでなければなりません。したがって、本質的には次のようになります。
public abstract class Skeleton
{
public IEnumerable<IBone> Bones { get { return _mBones; } }
public List<IBone> _mBones = new List<IBone>();
public void Attach(IBone bone)
{
bone.Transformation.ToLocal(this);
_mBones.add();
}
public void Detach(IBone bone)
{
bone.Transformation.ToWorld(this);
_mBones.Remove(bone);
}
}
しかし、C# では多重継承が許可されていません。そのため、さまざまな問題の中で、ユーザーは Skeleton を実装するたびに Skeleton から継承することを覚えておく必要があります。
拡張メソッドを使用できます
public static class Skeleton
{
public static void Attach(this ISkeleton skeleton, IBone bone)
{
bone.Transformation.ToLocal(skeleton);
skeleton.Bones.add(bone);
}
public static void Detach(this ISkeleton skeleton, IBone bone)
{
bone.Transformation.ToWorld(this);
skeleton.Bones.Remove(bone);
}
}
しかし、私は持っている必要があります
public interface ISkeleton
{
ICollection<IBone> Bones { get; }
}
共変ではなく、ユーザーが Attach() および Detach() メソッドをバイパスできるため、これは望ましくありません。
質問: 本当に抽象 Skeleton クラスを使用する必要がありますか、それともトリックやメソッドはありますか?