2011-09-15 25 views
0

どうすればよいですか?派生クラスは、基本クラスのstaticメソッドをオーバーライドされたプロパティで呼び出す必要があります

シナリオ:

abstract class DataAccess 
{ 
    public abstract string ConnectionString { get; set; } 

    public static DataTable ExecuteSql(string sql) 
    { 
     // ... 
    } 

    public static object ExecuteStoredProc(string storedProcName, ...) 
    { 
     // ... 
    } 
} 

abstract class DataAccessDb1 : DataAccess 
{ 
    public override string ConnectionString = "SetDbSpecificConnectionStringHere"; 

    public static DataTable GetStuff() 
    { 
     // Call the method with the ConnectionString set HERE. 
     return ExecuteSql("select * from stuff"); 
    } 
} 

私はそれはそれゆえ私はあらゆる方法でプロパティを設定しません、派生クラスでのように接続文字列を設定することが可能に知っているが、私は、静的な、それを維持したいことを知っています派生クラス...任意のアイデア?

答えて

2

はい:パラメータとして接続文字列をメソッドに渡します。 DataAccessDb1での宣言は無効

  • staticと多型であるので、

    • フィールドでは、多型の行動をしたいのであれば基本的には、インスタンスを使用する必要があり

    を混在させないでください、多形動作しません。メンバー。多相動作が本当に必要でない場合は、メソッドのパラメータとして任意のバリエーション(接続文字列など)を渡します。

  • +0

    私はそれをもう少しエレガントにすることができると思いました。ありがとうジョン! – timmkrause

    0

    C#に静的継承がないため、ConnectionStringには静的メンバーがあり、上書きすると機能しません。あなたのデザインを再考してください - ConnectionStringを静的にすると、タイプ自体に定義されているので、すべてのDataAccessインスタンスでこのフィールドが同じである必要があります。

    あなたは、静的メソッドを使用しますが、特定の理由です - インスタンスメソッドを使用して、コンストラクタに接続文字列を設定すると動作します:

    public class DataAccessDb1 
    { 
        public string ConnectionString {get;set;} 
    
        public DataAccessDb1() 
        { 
         ConnectionString = "SetDbSpecificConnectionStringHere"; 
        } 
    
        public void DataTable GetStuff() 
        { 
         return DataAccess.ExecuteSql(ConnectionString, "select * from stuff"); 
        } 
    } 
    
    +0

    派生クラスは静的である必要がありますので、コンストラクタを使用することはできません。 : – timmkrause

    +0

    好奇心の抱かない - なぜあなたはそれを静的にしたいのですか? – BrokenGlass

    +0

    私はデータアクションを行うオブジェクトを何十も作成したくないので、インスタンス化せずに "Customer.GetAddress()"ちょっと小さな例... – timmkrause

    0

    私はあなただけの抽象クラスでExecuteSQLメソッドを持つべきだと思いますどのようなすべての派生クラスはそれぞれの接続文字列でExecuteSqlを実装します。

    public abstarct string ConnectionString{get;set;} 
    

    は基本クラスから削除できます。

    +0

    これはJonの言ったことですが、今では接続文字列をExecuteSql()のパラメータとして渡す必要があります。 。:/ – timmkrause

    +1

    一般的に静的な使用を避けるべきです。オブジェクトを作成するために、シングルトンとファクトリパターンを使用することで問題を解決できます。具体的なDataAccessDbオブジェクトを作成するシングルトンファクトリクラスがあります。 DBAccessDb1の具体的なオブジェクトが必要です。接続文字列を必要とするはずです。私はそれを言葉で説明するのは難しいですが、書く時間はあまりありません。今すぐコード:( – DotNetUser

    +0

    どうしたの?それは本当に良いと思っていますが、私はそれの多くを理解していませんでした。 – timmkrause

    関連する問題