-4

クラス名をもう少しわかりやすくしたいと思います。次のような3つの同一のクラスがあります。

    public class Dog   
    {
        public string name;  
        public int id;  

        public Dog(){}
        public Dog(DataRow dr)
        {
            name = dr["Name"];
            id = dr["Id"];
        }   
    }    
    public class Cat
    {
        public string name;  
        public int id;  

        public Cat(){}
        public Cat(DataRow dr)
        {
            name = dr["Name"];
            id = dr["Id"];
        }   
    }
    public class Horse
    {
        public string name;  
        public int horseId;  

        public Horse(){}
        public Horse(DataRow dr)
        {
            name = dr["Name"];
            horseId= dr["horseId"];
        }   
    }    

基本クラスを使用してコードの重複を避けるにはどうすればよいですか? ベストプラクティスは何ですか? horse には Id ではなく HorseId というプロパティがあることに注意してください。ありがとう。

4

4 に答える 4

3

継承を使用します。

public class Animal 
{
    public string name;  
    public int id;  

    public Animal() {}
    public Animal(DataRow dr)
    {
        name = (string)dr["Name"];
        id = (int)dr["Id"];
    }   
}

// unfortunately, constructors aren't inherited automatically in C#.
public class Cat : Animal 
{
   public Cat() : base() {}
   public Cat(DataRow dr) : base(dr) {}
} 

public class Dog : Animal 
{     
   public Dog() : base() {}
   public Dog(DataRow dr) : base(dr) {}
}

public class Horse: Animal 
{
   public int horseId { get { return id; } set { id = value; } }
   public Horse() : base() {}
   public Horse(DataRow dr) : base(dr) {}    
}

編集: Blorgbeard が言うように、必要に応じてAnimalクラスを作成できます。abstractこれにより、インスタンス化が妨げられます (new Animal()違法になります。クライアント コードは特定のサブクラスを選択する必要があります)。

于 2012-12-18T01:00:17.640 に答える
0

オブジェクト指向デザインの良い例としては、2冊の本をお勧めします。

  1. オブジェクト指向の思考プロセス
  2. ロバートC.マーチンによるC#の敏捷な原則、パターンおよび実践。この本は、OOPの優れた原則を説明するのに非常に優れています。
于 2012-12-18T02:19:43.340 に答える
0

IAnimalプロパティを持つnameというインターフェイスを作成し、id上記の 3 つのクラスすべてにこのインターフェイスを実装させます。ここにあるものは、パブリック プロパティではなくパブリック変数を示しているため、ここにあるものとは少し異なることに注意してください。変数を維持したい場合は、Animalパブリック変数nameを持つ基本クラスを使用し、内部的に、このように基本プロパティを取得および設定するプロパティidに変換しますhorseIdidpublic int horseId { get { return base.id; } set { base.id = value; } }

于 2012-12-18T00:59:08.070 に答える
0

私はこのようなことをします-抽象基本クラス。

public abstract class Animal {
   public string name;
   public int id;
   protected Animal() {}
   protected Animal(DataRow dr) {
      name = (string)dr["Name"];
      id = (int)dr["Id"];
   }
}

public class Cat : Animal {
   public Cat() : base() {}
   public Cat(DataRow dr) : base(dr) {}
}

次に、馬にプロパティを追加するだけです(まだ残ってidいます)

public class Horse : Animal {
   public int horseid { get { return id; } set { id = value; } }
   public Horse() : base() {}
   public Horse(DataRow dr) : base(dr) {}
}

idこのメソッドでは、クラスでの削除/非表示が許可されていないため、 と のHorse両方がありますが、idそのhorseid下で同じ変数が使用されます。

于 2012-12-18T01:00:36.830 に答える