C# 如何只编写一次childs的部分构造函数?
我目前在一个抽象教室工作,里面有七个不同的儿童班。如果我在抽象类中添加了一些东西(比如name属性),我就厌倦了将其中一个子类的构造函数的一部分复制粘贴到其他六个子类中 在添加必须为每个子级设置相同/实例化的属性时,我以什么方式不打破DRY原则 例如:C# 如何只编写一次childs的部分构造函数?,c#,constructor,abstract-class,parent-child,C#,Constructor,Abstract Class,Parent Child,我目前在一个抽象教室工作,里面有七个不同的儿童班。如果我在抽象类中添加了一些东西(比如name属性),我就厌倦了将其中一个子类的构造函数的一部分复制粘贴到其他六个子类中 在添加必须为每个子级设置相同/实例化的属性时,我以什么方式不打破DRY原则 例如: public abstract Room { // Need to be assigned in constructor. protected int RoomNumber { get; set; } protected
public abstract Room
{
// Need to be assigned in constructor.
protected int RoomNumber { get; set; }
protected int PositionX { get; set; }
protected int PositionY { get; set; }
// Always the same at the start
protected List<Guest> GuestsInRoom { get; set; }
protected string ImageFilePath { get; set; }
}
public class Bedroom : Room
{
private string Classification { get; set; }
public Bedroom()
{
// Assign/instantiate all properties.
}
}
public class Bathroom : Room
{
private string SomeOtherProperty { get; set; }
public Bedroom()
{
// Assign/instantiate all properties again
}
}
公共摘要室
{
//需要在构造函数中赋值。
受保护的int-RoomNumber{get;set;}
受保护的int-PositionX{get;set;}
受保护的int-PositionY{get;set;}
//一开始总是一样的
受保护列表文件室{get;set;}
受保护的字符串ImageFilePath{get;set;}
}
公厕
{
私有字符串分类{get;set;}
公共卧室()
{
//分配/实例化所有属性。
}
}
公共浴室:客房
{
私有字符串SomeOtherProperty{get;set;}
公共卧室()
{
//再次分配/实例化所有属性
}
}
向基类添加构造函数。如果有必须指定的字段,请将其设置为必需参数。可以使用“:base()”调用非空父类构造函数,如修改后的类中所示
public abstract Room
{
// Need to be assigned in constructor.
protected int RoomNumber { get; set; }
protected int PositionX { get; set; }
protected int PositionY { get; set; }
// Always the same at the start
protected List<Guest> GuestsInRoom { get; set; }
protected string ImageFilePath { get; set; }
protected Room(int roomNumber, int positionX, int positionY)
{
RoomNumber = roomNumber;
PositionX = positionX;
PositionY = positionY;
GuestsInRoom = new List<Guest>();
}
}
public class Bedroom : Room
{
private string Classification { get; set; }
public Bedroom(string classification, int roomNumber, int positionX, int positionY)
: base(roomNumber, positionX, positionY)
{
// Assign/instantiate all properties.
Classification = classification;
}
}
公共摘要室
{
//需要在构造函数中赋值。
受保护的int-RoomNumber{get;set;}
受保护的int-PositionX{get;set;}
受保护的int-PositionY{get;set;}
//一开始总是一样的
受保护列表文件室{get;set;}
受保护的字符串ImageFilePath{get;set;}
受保护房间(内部房间号、内部位置X、内部位置Y)
{
RoomNumber=RoomNumber;
位置X=位置X;
位置Y=位置Y;
GuestInRoom=新列表();
}
}
公厕
{
私有字符串分类{get;set;}
公共卧室(字符串分类、内部房间号、内部位置X、内部位置Y)
:底座(房间号、位置X、位置Y)
{
//分配/实例化所有属性。
分类=分类;
}
}
向基类添加构造函数。如果有必须指定的字段,请将其设置为必需参数。可以使用“:base()”调用非空父类构造函数,如修改后的类中所示
public abstract Room
{
// Need to be assigned in constructor.
protected int RoomNumber { get; set; }
protected int PositionX { get; set; }
protected int PositionY { get; set; }
// Always the same at the start
protected List<Guest> GuestsInRoom { get; set; }
protected string ImageFilePath { get; set; }
protected Room(int roomNumber, int positionX, int positionY)
{
RoomNumber = roomNumber;
PositionX = positionX;
PositionY = positionY;
GuestsInRoom = new List<Guest>();
}
}
public class Bedroom : Room
{
private string Classification { get; set; }
public Bedroom(string classification, int roomNumber, int positionX, int positionY)
: base(roomNumber, positionX, positionY)
{
// Assign/instantiate all properties.
Classification = classification;
}
}
公共摘要室
{
//需要在构造函数中赋值。
受保护的int-RoomNumber{get;set;}
受保护的int-PositionX{get;set;}
受保护的int-PositionY{get;set;}
//一开始总是一样的
受保护列表文件室{get;set;}
受保护的字符串ImageFilePath{get;set;}
受保护房间(内部房间号、内部位置X、内部位置Y)
{
RoomNumber=RoomNumber;
位置X=位置X;
位置Y=位置Y;
GuestInRoom=新列表();
}
}
公厕
{
私有字符串分类{get;set;}
公共卧室(字符串分类、内部房间号、内部位置X、内部位置Y)
:底座(房间号、位置X、位置Y)
{
//分配/实例化所有属性。
分类=分类;
}
}
改为在基类中设置属性,并使每个子类构造函数链接到基类构造函数。如果你能提供一个具体的例子而不是描述,那么向你展示具体的解决方案会容易得多。无论如何,您建议的是受保护的列表guestinsroom{get;set;}=new List
,而不是将属性放在Room中,并在每个子级的构造函数中实例化?不是这样。不幸的是,即使有了这个示例,您也没有显示任何重复。您应该显示至少两个包含重复代码的子类,这样我们就可以计算出应该提取到基类的内容。我认为通过上面示例中给出的上下文,我的意思很清楚。不,事实并非如此。完整示例的目的是展示您试图改进/修复的内容。如果您试图删除重复,这意味着您需要显示重复当前发生的位置。您可以改为在基类中设置属性,并使每个子类构造函数链接到基类构造函数。如果你能提供一个具体的例子而不是描述,那么向你展示具体的解决方案会容易得多。无论如何,您建议的是受保护的列表guestinsroom{get;set;}=new List
,而不是将属性放在Room中,并在每个子级的构造函数中实例化?不是这样。不幸的是,即使有了这个示例,您也没有显示任何重复。您应该显示至少两个包含重复代码的子类,这样我们就可以计算出应该提取到基类的内容。我认为通过上面示例中给出的上下文,我的意思很清楚。不,事实并非如此。完整示例的目的是展示您试图改进/修复的内容。如果您试图删除重复,这意味着您需要显示重复当前发生的位置。噢,通过构造函数上的:base()
,您告诉构造函数也调用基本类的构造函数。谢谢哦,通过构造函数上的:base()
,您告诉构造函数也调用基本类的构造函数。谢谢