Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名称不同的相同类_C#_Class - Fatal编程技术网

C# 名称不同的相同类

C# 名称不同的相同类,c#,class,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 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有一个名为HorseId的属性,而不是Id。谢谢。

我将创建一个名为IAnimal的接口,该接口具有属性名称和Id,并让上面所有3个类实现该接口。注意和这里的稍有不同,因为这里显示的是公共变量,而不是公共属性。如果您想维护变量,那么我将使用一个带有公共变量name和id的基类Animal,并将horseId转换为一个属性,该属性在内部获取和设置基类id属性,如公共int horseId{get{return base.id;}set{base.id=value;}}

使用继承

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设置为抽象类——这将防止实例化新的Animal是非法的;客户端代码必须选择一个特定的子类

我会这样做——一个抽象基类

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


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

关于面向对象设计的一些好例子,我推荐两本书

面向对象的思维过程 C语言中的敏捷原则、模式和实践。这本书在解释OOP的伟大原理方面非常棒。
我的建议是不要叫它horseId:@minitech,是的,也许你是对的。但是我创建了一个基类并继承了这个类?这意味着我的三个类将是空的,对吗?@user194076:创建一个类Animal并通过构造函数参数传递Animal类型enum怎么样?它们可能是空的,但如果它们只是作为名称存在,那么为什么不命名变量并使用基类呢?或者情况非常复杂?我注意到没有一个答案推荐公共属性而不是公共字段,也没有对基本编码标准发表评论,因此当前的答案都不会从我这里得到+1…当然接口可以有属性-它们不能有变量。public interface IAnimal{int id{get;set;}字符串名称{get;set;}他问了两件可能相互冲突的事情。我猜他是新来的,他正在试图弄清楚是什么。我给了两个选项来解决这个问题——一个是接口,一个是基类。他问什么是最佳实践,所以我给了他两个选项。他还提出了horseId的一个特例,我也和其他人一样解决了这个问题s、 从纯粹主义者的角度来看,在这种情况下,一个抽象的基础可能就足够了,因为接口IAnimal并没有描述它能做什么,而是描述它有什么特性。尽管如此,我不明白为什么向他展示两个选项会如此糟糕。看看这个问题,我认为可以安全地假设horseId是一个错误,实际上应该是一个像ot一样的id她的。在数据对象上引入接口是很少见的,尤其是当你已经有了一个基类的时候,更不用说接口本身并不能减少代码的重复。阅读Q slugster。他指出horseId是不同的。所以不,不是一个错误。
public class Horse : Animal {
   public int horseid { get { return id; } set { id = value; } }
   public Horse() : base() {}
   public Horse(DataRow dr) : base(dr) {}
}