-4

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

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

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

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

As far as some good examples on object oriented design, I'd recommend two books.

  1. The Object Oriented Thought Process
  2. Agile Principles, Patterns and Practices in C# by Robert C. Martin. This book is just awesome at explaining great principles of OOP.
于 2012-12-18T02:19:43.340 回答
0

我会创建一个名为的接口IAnimal,它具有属性nameid并且上面的所有 3 个类都实现了这个接口。注意与您在此处所拥有的略有不同,因为您在此处所拥有的是公共变量,而不是公共属性。如果你想维护变量,那么我会使用一个Animal带有公共变量的基类nameid并转换horseId为一个属性,它可以id像这样获取和设置基本属性public 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) {}
}

然后只需向 Horse 添加一个属性(仍然离开id

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

此方法不允许您idHorse类中删除/隐藏,因此您将同时拥有idand horseid,但它们将在下面使用相同的变量。

于 2012-12-18T01:00:36.830 回答