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) {}
}