.NET CORE 3.1 C# 8.0
表題のイメージは以下のような形になります。
Tのメソッド、プロパティにショートカットで直接アクセスできる方法はないかと調べておりました。
※_dataをpublicにしてアクセスすればよいのですが、デリゲートのような形でアクセスを委任できるとスマートに書けるなと思いまして。
class Hoge<T> where T : class { T _data; public Hoge() { _data = new T(); } // 共通処理... } class A { public string A_Method(){ return "I am A." } public int A_Property { get; set; } } class B { public string B_Method(){ return "I am B." } public long B_Property1 { get; set; } public int B_Property2 { get; set; } } var hoge = new Hoge<A>(); hoge.A_Method(); hoge.A_Propaty; var hoge2 = new Hoge<B>(); hoge2.B_Method(); hoge2.B_Propaty1; hoge2.B_Propaty2;
良い方法がございましたらご教授いただけると助かります。
根本的に何がやりたいのかを書いてください。
外からアクセスしたいなら公開すれば良いし、公開しないならアクセスされたらまずいわけですよね?
それと_data = new T();と書いてますが、引数無しのコンストラクタを持たないクラスはどうしますか?
hihijijiさんに同意します。
アクセスしたいだけであれば(A)hoge.A_Method();と書けば良いと思いますが、それだとジェネリッククラス経由でインスタンスを生成する必要性が分かりません。
情報が不足しており申し訳ございません。
やりたいことは外に公開はしたいけど、書き方を簡潔にしたいというところになります。
public T Data;
hoge.Data.A_Propaty
↓
hoge.A_Propaty
Tは引数無しのコンストラクタのクラスのみになります。
イメージではすいません省略していますが実際のwhereは細かく制約がつきます。
Hoge<T> と T が継承関係にないのでできません。
もう1点すいません。イメージでは省略しておりますが
実際のHogeクラスには各種共通の処理もはいります。
中のデータにアクセスしたい+共通処理のラッパークラスのようなジェネリッククラスとなります。
質問と関係があるかわかりませんが、AとBで共通点があり、Hogeクラスでそれらを使った共通の処理があるのであればAとBは継承なりinterfaceを実装するなりしてポリモーフィズムする方が良いかもしれません。適当なことを書いていたらスルーしてください。
※そもそもHogeクラスが必要なのかどうかも分かりませんが…
おっしゃるとおりです。
Tに入る、AとBにinterfaceなり親クラスなりで書けるとよいのですが、外部のクラスのため構造は変更が難しい状態となっておりまして、今回のようなラッパー的なクラスを考えました。
質問文に var hoge = new Hoge<A>(); ではなく var hoge = new A(); ではいけない理由を記載して頂けるでしょうか。
おそらく「Hogeクラスには各種共通の処理もはいる」からだと思いますが、その共通の処理が何をしている(どうAとBに依存している)のかが分からないので、可能ならそれを無理のない形で質問のコードに追加して頂きたいです。
改めて見直してみると、やりたいことが理解できました。
回答3件
あなたの回答
tips
プレビュー