ジェネリックなプロパティの実装を非ジェネリックなインターフェースで強制させることができるか

質問に至るバックグラウンド

自身のUnityプロジェクトにおけるFSMで以下のImtStateMachineを採用しています.
https://github.com/Sinoa/ImtStateMachine/blob/develop/Packages/ImtStateMachine/Runtime/StateMachine.cs
実装を進める上で,

「ステートマシンを実装しているクラスをまとめて扱いたい」

という要件がでてきました.
単純に考えると,基底クラス/インターフェースを使えばいいとおもいましたがどうやっても実現できませんでした.

該当のソースコード

ImtStateMachineはジェネリックで以下のように定義されます.

C#

1using IceMilkTea.Core;2 3public class SampleClass 4{5 public enum EventId6 {7 event1,8 event2,9 event3,10 }11 public ImtStateMachine<SampleClass, EventId> StateMachine { get; set; }12}

私としては,EventIdとStateMachineプロパティの実装を強制し,StateMachineを適切に外部に公開したいのですが,
ImtStateMachineは派生クラスをジェネリックに指定する必要があるので基底側で定義することができません.そこで次のようにしたんですが...

C#

1public interface IState<TContext, TEvent>2{3 public ImtStateMachine<TContext, TEvent> StateMachine { get; set; }4}5public class SampleClass : IState<SampleClass, SampleClass.EventId>6{7 public enum EventId8 {9 event1,10 event2,11 event3,12 }13 public ImtStateMachine<SampleClass, EventId> StateMachine { get; set; }14}

確かにこれで実装を強制できたのですが,

C#

1IState state = new SampleClass();2state.StateMachine.SendEvent......

的なことができないのでこのインターフェースは利用側にはほとんど価値がありません.
(例えば,IStateを全部取得して全てのStateMachineをIdle状態にするといったことができない)
なので実際はIStateは非ジェネリックでなければならないことにここで気が付きましたが,そうなるとImtStateMachineが定義できなくなってしまいます.

以上を踏まえての質問

C#でジェネリックなプロパティを非ジェネリックなインターフェースを通して実装の強制,外部への公開は可能でしょうか?

ご回答よろしくおねがいいたします.

コメントを投稿

0 コメント