2012-03-22 2 views
5

(どのようにハイレベルのクラスは、高レベルのデータと基底クラスのメソッドを呼び出すことができます)、それはおそらく、だまされやすい人だが、ここで私はc#静的プロパティをオーバーライドできないのはなぜですか?私の質問は、おそらくうまく言葉で表現されていない

class person { 
    protected static string request = "select * from person where gender in ('male','female')"; 
    public string sharedmethod() 
    { 
     return "the request is" + request; 
    } 
} 

class man:person 
{ 
    override protected static string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    DateTime dateOfFirstCar; 
} 

class woman:person 
{ 
    override protected static string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    DateTime dateOfFirstITBAG; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (new person().sharedmethod() == new man().sharedmethod()) 
      Console.Write("too bad query is the same in base and dervide class"); 
    } 
} 

を行く男が
女性がある人ですある人
人、男性、女性がデータベースに存在しますが、異なるクエリが必要です

これらのクエリを複製したくないので、各クラスの静的プロパティにそれらを格納することをお勧めしました。

私はいくつかの低レベルのもの(そこに考え出していない)、基本クラスでその嘘を(私が複製する必要はありませんだって)だと私はheritedクラス

の文脈で基底クラスのメソッドを呼び出すために継承したクラスを望んでいました(person.somemethodを実行する

私は男をしたい。(のsomeMethod [継承]))が、男

から来る変数が

答えて

3

ありがとうございましたとすると、静的な文字列、および参照そのプロパティをカバーする非静的プロパティを追加します。代わりに:

class person { 
    private const string request = "select * from person where gender in ('male','female')"; 
    protected virtual string Request {get {return request;}} 
    public string sharedmethod() { 
     return "the request is" + Request; 
    } 
} 

class man:person { 
    private const string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstCar; 
} 

class woman:person { 
    private const string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstITBAG; 
} 
+0

ありがとうございますが、人の質問はどうですか? – frenchone

+1

@frenchone私はその部分を逃した。 'abstract'ではなく' virtual'プロパティを作成し、 'person'クラスで実装を追加し、導出された実装に' override'を追加する必要があります。 – dasblinkenlight

+0

よろしくお願いします – frenchone

3

なぜあなたはできませんか? .netの設計者は、その機能をフレームワークに追加することはそれが価値があったのではなく、より困難であると判断したためです。

デザインに対応するため、それを改善するための方法がたくさんある通り...

一つは、静的なヘルパークラスを持っていることと、静的な文字列でSQLを入れて、静的メソッドを追加しますそれを返すためにPerson、Man Womanなどから呼び出すと、Personには列挙型を、ヘルパークラスには静的なGetSqlを置くと、それは完了です。

ああ、あなたの受け入れ率を整理してください、そうでなければ人々はあなたを助けるつもりはありません。

+0

>あなたのデザインを扱うには、それをもっと良くする方法がたくさんあります... 私の質問は「それをより良くする」ということですか? >静的ヘルパークラスヘルパークラスは悪いと思いましたか? – frenchone

+2

悪い授業はありませんが、悪にも使えます。静的な工場パターンは悪いですか? .Netは静的ヘルパークラスでいっぱいです。 Delphi VCLもそうで、静的メソッドをオーバーライドすることができます。読みやすく、目的に合っていればいいですね。オブジェクト指向の枠組みのなかで他に分かりやすい方法はありません。 –

関連する問題