我希望在我的班级名称中更具描述性。我有三个相同的类,如下所示:
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的属性。感谢。
答案 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
的接口,它具有属性name
和id
,并且上面的所有3个类都实现了此接口。注意与您在此处略有不同,因为您在此处显示的是公共变量,而不是公共属性。如果你想维护变量,那么我会使用带有公共变量Animal
和name
的基类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
,因此您同时拥有id
和horseid
,但他们会使用相同的在下面变量。
答案 3 :(得分:0)
就面向对象设计的一些好例子而言,我推荐两本书。