具有不同名称的相同类别

时间:2012-12-18 00:53:48

标签: c# class

我希望在我的班级名称中更具描述性。我有三个相同的类,如下所示:

    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"];
        }   
    }    

如何使用基类来避免代码重复?什么是最好的实践? pplease注意马有一个名为HorseId而不是Id的属性。感谢。

4 个答案:

答案 0 :(得分: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()将是非法的;客户端代码必须选择一个特定的子类)。

答案 1 :(得分:0)

我会创建一个名为IAnimal的接口,它具有属性nameid,并且上面的所有3个类都实现了此接口。注意与您在此处略有不同,因为您在此处显示的是公共变量,而不是公共属性。如果你想维护变量,那么我会使用带有公共变量Animalname的基类id,并将horseId转换为一个属性,从而可以获取和设置像id

这样的基本public int horseId { get { return base.id; } set { base.id = value; } }属性

答案 2 :(得分: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) {}
}

然后只需向Horse添加一个属性(仍然离开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,因此您同时拥有idhorseid,但他们会使用相同的在下面变量。

答案 3 :(得分:0)

就面向对象设计的一些好例子而言,我推荐两本书。

  1. 面向对象的思维过程
  2. C#中的敏捷原则,模式和实践,由Robert C. Martin撰写。这本书对于解释OOP的重要原则非常棒。
相关问题