静的方法インターフェース/抽象クラス
-
08-06-2019 - |
質問
まず、理解している理由はインターフェースや抽象クラス。NET/C#用語)はできない抽象静ます。私の質問はそれをより重視した最高のデザイン。
だいたいの"のヘルパー"の授業を全て自分のstaticメソッドになる場合には取得します物体のA、B、C第三者からのベンダーでき、ヘルパークなどの方法
AHelper.RetrieveByID(string id); AHelper.RetrieveByName(string name); AHelper.DumpToDatabase();
私のAHelper,BHelper、CHelper授業はすべて基本的に同じ方法でいるような感動これらの方法をインターフェイスこれらのクラスを導き出します。したいという思いから、これらの方法に静を妨げいることから、汎用インタフェースや抽象クラス全員について記入してください出します。
私は常にこれらの方法の非staticおよびそのインスタンスを生成の最初のオブジェなど
AHelper a = new AHelper(); a.DumpToDatabase();
しかし、このコードなどの直感的です。うう方に。きを放棄をインターフェースや抽象クラスは全の状況を今までこの可能性がある整理を達成するデザイン思うのですか?
解決
見 ご回答 しようと考え、次のような
- ることができて静的な方法を取るタイプのパラメータを行う予定の論理に基づくタイプです。
- またバーチャルクラスルームを作成方法お抽象基底し、ご指定のSQLのコンクリートクラスです。その全ての共通コードを要求された場合の両方の例exectutingのコマンドの返却のオブジェクト)を封の"スペシャリスト"として、ビット(例えばのSQL)のサブます。
私好みのオプションはもちろんました。が必要な場合に行ってみて、さらなる詳細なりましたらご一報くださいませていただき編集-更新)
他のヒント
いったいうわませないようにしてください統計情報にまぁ私は常に息のある種の同期の問題道統計情報にいすを提示す典型的な例としては、ジェネリックグ用テンプレート。私はこのテンプレートに基づく解Rob銅の表示、投稿ます。
汎用的な解決を与え、これを実行する事ができます。:
public static T RetrieveByID<T>(string ID)
{
var fieldNames = getFieldNamesBasedOnType(typeof(T));
QueryResult qr = webservice.query("SELECT "+fieldNames + " FROM "
+ tyepof(T).Name
+" WHERE Id = '" + ID + "'");
return (T) qr.records[0];
}
私が個人的にも問題はなぜそれぞれの種類が必要となり静的な方法も考えら..
なぜな作utlityクラスのstaticメソッドを必要としていること。(例: ClassHelper.RetrieveByID(string id)
または ClassHelper<ClassA>.RetrieveByID(string id)
私の経験これらのような"事業運営に問題はありませんが、言語の制約がデザインの..
どのようObjectAとAHelperの関係は以下のようになります。は AHelper.RetrieveByID()
同じ論理として BHelper.RetrieveByID()
ある場合、どのユーティリティクラスに基づくアプローチ(クラスはpublic staticメソッドのみの状態)
static [return type] Helper.RetrieveByID(ObjectX x)
できな負荷方法により異なるものを返します。
利用できる異なる名前:
static AObject GetAObject(string id);
static BObject GetBObject(string id);
を作成することができますを持つクラスの鋳造オペレーター
class AOrBObject
{
string id;
AOrBObject(string id) {this.id = id;}
static public AOrBObject RetrieveByID(string id)
{
return new AOrBObject(id);
}
public static AObject explicit operator(AOrBObject ab)
{
return AObjectQuery(ab.id);
}
public static BObject explicit operator(AOrBObject ab)
{
return BObjectQuery(ab.id);
}
}
そのまま通話ではこのように:
var a = (AObject) AOrBObject.RetrieveByID(5);
var b = (BObject) AOrBObject.RetrieveByID(5);
クライアントまで、フルのC#3.0では、staticメソッドで使用できるインターフェースにおいて、それらの一部を拡張方法、DumpToDatabase()以下
static class HelperMethods
{ //IHelper h = new HeleperA();
//h.DumpToDatabase()
public static void DumpToDatabase(this IHelper helper) { /* ... */ }
//IHelper h = a.RetrieveByID(5)
public static IHelper RetrieveByID(this ObjectA a, int id)
{
return new HelperA(a.GetByID(id));
}
//Ihelper h = b.RetrieveByID(5)
public static IHelper RetrieveByID(this ObjectB b, int id)
{
return new HelperB(b.GetById(id.ToString()));
}
}
どんなポストフィードバックのスタックオーバーフロー?編集私のオリジナルポストやポストに"答え"?とにかく、いかと考えたの助けをしているかをAHelper.RetrieveByID()およびBHelper.RetreiveByID()
基本的には、これらの方法はかりに対する第三者webserviceを返す各種汎用(キャスタブル)オブジェクトを検索間に擬似SQL文字列としてだけます。
なので、AHelper.RetrieveByID(string ID)のようにな
public static AObject RetrieveByID(string ID) { QueryResult qr = webservice.query("SELECT Id,Name FROM AObject WHERE Id = '" + ID + "'"); return (AObject)qr.records[0]; } public static BObject RetrieveByID(string ID) { QueryResult qr = webservice.query("SELECT Id,Name,Company FROM BObject WHERE Id = '" + ID + "'"); return (BObject)qr.records[0]; }
も役立っています。ご覧の通り、二つの方法は類似しており、そのクエリでかなり異なるの異なるオブジェクトの型が返されます。
ああ、バ僕もそうだと思いました--このよう制限の設計およびなされたものの翻訳であります。:)
について多型的に振る舞えるのでしょうか?しょうたいのは、通常のコンストラクタです。何unintuitive約を呼び出すコンストラクタ?必要がない場合に多型(音のように使わないので)、そのまま貼りと静ます。これらすべてのラッパーの周りにベンダー部品そのものが利用するようにして"ファクトリメソッドをそのようなVendorBuilder.GetVendorThing("A")が返すオブジェクトの型IVendorWrapper.