実現したいこと
言葉でうまく説明できないのですが、下記のような構造を実現したいです。
IHoge.cs
1public interface IHoge 2{ 3 IHoge CreateInstance(); 4}
Hoge.cs
1public class Hoge : IHoge 2{ 3 public string Prop1 { get; } 4 public IHoge CreateInstance(){ 5 return new Hoge(); 6 } 7}
Hoge2.cs
1public class Hoge2 : IHoge 2{ 3 public IHoge CreateInstance(){ 4 return new Hoge2(); 5 } 6}
HogeUseBase.cs
1abstract public class HogeUseBase<T> where T : IHoge, new() 2{ 3 public List<T> hogelist = new List<T>(); 4 5 public void CreateHoge(){ 6 var hoge = new T(); 7 hogelist.Add(hoge.CreateInstance()); 8 } 9 10 abstract public void UseHoge(); 11}
HogeUse.cs
1public class HogeUse : HogeUseBase<Hoge> 2{ 3 override public void UseHoge(){ 4 foreach(var h in this.hogeList){ 5 string prop = h.Prop1; 6 } 7 } 8}
場合によってHoge, Hoge2どちらを使うか変えたいため、IHogeインターフェースに
CreateInstanceメソッドをシグネチャとして定義しました。
(補足の質問: .NETFramework4.8ではstaticなシグネチャやインスタンスのシグネチャをinterfaceで定義できないので仕方なくこの形にしました。この部分も良い実装があればお聞きしたいです。)
また、HogeUseBaseではHogeかHoge2かは意識せず扱える部分のみ実装してあります。
HogeUseでは、Hogeのプロパティへのアクセスを行いたいです。
発生している問題・分からないこと
実現したいことの書き方の場合、HogeUseBaseの7行目でIHogeからTへ変換できないエラーとなる
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
HogeUseBaseでジェネリック型を使わない以下の書き方の場合は
HogeUse5行目でHogeのプロパティへアクセスできない。
HogeUseBase.cs
1abstract public class HogeUseBase<T> where T : IHoge, new() 2{ 3 public List<IHoge> hogelist = new List<IHoge>(); 4 5 public void CreateHoge(){ 6 var hoge = new T(); 7 hogelist.Add(hoge.CreateInstance()); 8 } 9 10 abstract public void UseHoge(); 11}
補足
C# .NETFramework4.8
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。