C# 建议一种设计模式?
我一直在思考实现某种功能的最佳方式。。。引用具有相同基础的其他派生对象(包括相互引用)的派生对象 下面是我能想到的最好(简单)的例子来说明这类问题:一个房子由3个房间组成(虽然实际上可能有数百个房间),每个房间都由自己的派生类表示。当然,它不会像现在这样工作,它会导致堆栈溢出(适当!) 假设示例中的每个房间都特定于虚拟房屋中的一个房间,则任何子类的实例都不应超过一个。构建大量实例,即使没有递归,也会很混乱。这会让我想到单身,如果这不是一个禁忌的话。。。有人能提出更合适的建议吗 谢谢大家!C# 建议一种设计模式?,c#,oop,C#,Oop,我一直在思考实现某种功能的最佳方式。。。引用具有相同基础的其他派生对象(包括相互引用)的派生对象 下面是我能想到的最好(简单)的例子来说明这类问题:一个房子由3个房间组成(虽然实际上可能有数百个房间),每个房间都由自己的派生类表示。当然,它不会像现在这样工作,它会导致堆栈溢出(适当!) 假设示例中的每个房间都特定于虚拟房屋中的一个房间,则任何子类的实例都不应超过一个。构建大量实例,即使没有递归,也会很混乱。这会让我想到单身,如果这不是一个禁忌的话。。。有人能提出更合适的建议吗 谢谢大家! pub
public abstract class Room
{
abstract public void DoAction();
public Room[] ConnectedRooms;
}
public class Kitchen : Room
{
public Kitchen() { ConnectedRooms = new Room[] { new Hall() }; }
public override void DoAction() { MakeTea(); }
}
public class Bedroom : Room
{
public Bedroom() { ConnectedRooms = new Room[] { new Hall() }; }
public override void DoAction() { Sleep(); }
}
public class Hall : Room
{
public Hall() { ConnectedRooms = new Room[] { new Hall(), new Bedroom() }; }
public override void DoAction() { LookOutWindow(); }
}
您的房间应该包含对其他房间实例的引用,而不是对新实例的引用
e、 g.新建厨房
,大厅
,卧室
。然后将大厅
的参考传递给卧室
,传递给厨房
等。这样你就有了三个对象,它们也有了相邻房间的参考
Kitchen k = new Kitchen();
Bedroom b = new Bedroom();
k.addNeighbour(b);
等等
(我通常会用适当的引用构建一个厨房
,但您似乎有循环引用,所以这并不容易)
如果您确实只需要每个实例的一个实例,请查看。然而,除非绝对必要,否则我不会强制执行。毕竟,很多房子都不止一间卧室 您的房间应该包含对其他房间实例的引用,而不是对新实例的引用
e、 g.新建厨房
,大厅
,卧室
。然后将大厅
的参考传递给卧室
,传递给厨房
等。这样你就有了三个对象,它们也有了相邻房间的参考
Kitchen k = new Kitchen();
Bedroom b = new Bedroom();
k.addNeighbour(b);
等等
(我通常会用适当的引用构建一个厨房
,但您似乎有循环引用,所以这并不容易)
如果您确实只需要每个实例的一个实例,请查看。然而,除非绝对必要,否则我不会强制执行。毕竟,很多房子都不止一间卧室 您需要做的就是避免在另一个房间的构造函数中实例化一个房间。您需要实例化所有房间(Kitchen k=new Kitchen();Hall h=new Hall();),然后添加连接(k.ConnectedRooms[0]=h;h.ConnectedRooms[0]=k;)。或者,聪明地说,创建一个相互连接的方法:
public abstract class Room
{
public void Connect(Room r)
{
this.ConnectedRooms.Add(r);
r.ConnectedRooms.Add(this);
}
}
假设您将连接数组更改为列表,这可能是一个好主意。您需要做的就是避免在另一个房间的构造函数中实例化一个房间。您需要实例化所有房间(Kitchen k=new Kitchen();Hall h=new Hall();),然后添加连接(k.ConnectedRooms[0]=h;h.ConnectedRooms[0]=k;)。或者,聪明地说,创建一个相互连接的方法:
public abstract class Room
{
public void Connect(Room r)
{
this.ConnectedRooms.Add(r);
r.ConnectedRooms.Add(this);
}
}
假设您将连接数组更改为列表,这可能是一个好主意。您确实需要进一步封装(这个词对吗?)您的模型
public class House
{
private readonly Hall hall = new Hall();
private readonly Kitchen kitchen = new Kitchen();
// etc
public House()
{
hall.AddAdjacentRoom(kitchen);
// etc
}
}
您确实需要进一步封装(这个词对吗?)您的模型
public class House
{
private readonly Hall hall = new Hall();
private readonly Kitchen kitchen = new Kitchen();
// etc
public House()
{
hall.AddAdjacentRoom(kitchen);
// etc
}
}
我的想法完全正确。我也不认为单身在这里是合适的,因为你可能会想要某些类型房间的多个实例。。。即使您没有这样做,也只会增加不必要的复杂性。这个想法是正确的,一次创建所有房间并保留连接的引用,而不是多次创建每个房间。谢谢,这很有趣,尽管这需要将连接定义从类定义移开。。。我想这是有利弊的。在类定义中,很容易找到定义类的连接的位置。然而,在一个地方定义所有连接也有其优点,每个类都可以从同一个抽象基类派生,该抽象基类将连接记录在“主”类的一个实例中。听起来你需要一个“构建”类,这个类对正在发生的事情有一个规范的视图。为什么?你能给我一个理由说明为什么上面的说法是错误的或没有帮助的吗?我的想法完全正确。我也不认为单身在这里是合适的,因为你可能会想要某些类型房间的多个实例。。。即使您没有这样做,也只会增加不必要的复杂性。这个想法是正确的,一次创建所有房间并保留连接的引用,而不是多次创建每个房间。谢谢,这很有趣,尽管这需要将连接定义从类定义移开。。。我想这是有利弊的。在类定义中,很容易找到定义类的连接的位置。然而,在一个地方定义所有连接也有其优点,每个类都可以从同一个抽象基类派生,该抽象基类将连接记录在“主”类的一个实例中。听起来你需要一个“构建”类,这个类对正在发生的事情有一个规范的视图。为什么?你能解释一下为什么上面的说法是错误的或没有帮助的吗?我不推荐这里的singleton仅仅是为了强制执行单实例要求。如果你不知道自己在做什么,就很难推荐任何东西。有时最好的设计模式是没有设计模式。最好知道什么时候不使用模式,而不是使用哪个模式。大厅构造器应该将连接的房间设置到另一个大厅还是厨房?我不建议这里的singleton只是为了强制执行单实例要求。如果你不知道自己在做什么,就很难推荐任何东西。有时最好的设计模式是没有设计模式。最好知道什么时候不使用模式,而不是使用哪个模式。霍尔构造器是应该的吗