Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Oop - Fatal编程技术网

C# 建议一种设计模式?

C# 建议一种设计模式?,c#,oop,C#,Oop,我一直在思考实现某种功能的最佳方式。。。引用具有相同基础的其他派生对象(包括相互引用)的派生对象 下面是我能想到的最好(简单)的例子来说明这类问题:一个房子由3个房间组成(虽然实际上可能有数百个房间),每个房间都由自己的派生类表示。当然,它不会像现在这样工作,它会导致堆栈溢出(适当!) 假设示例中的每个房间都特定于虚拟房屋中的一个房间,则任何子类的实例都不应超过一个。构建大量实例,即使没有递归,也会很混乱。这会让我想到单身,如果这不是一个禁忌的话。。。有人能提出更合适的建议吗 谢谢大家! pub

我一直在思考实现某种功能的最佳方式。。。引用具有相同基础的其他派生对象(包括相互引用)的派生对象

下面是我能想到的最好(简单)的例子来说明这类问题:一个房子由3个房间组成(虽然实际上可能有数百个房间),每个房间都由自己的派生类表示。当然,它不会像现在这样工作,它会导致堆栈溢出(适当!)

假设示例中的每个房间都特定于虚拟房屋中的一个房间,则任何子类的实例都不应超过一个。构建大量实例,即使没有递归,也会很混乱。这会让我想到单身,如果这不是一个禁忌的话。。。有人能提出更合适的建议吗

谢谢大家!

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只是为了强制执行单实例要求。如果你不知道自己在做什么,就很难推荐任何东西。有时最好的设计模式是没有设计模式。最好知道什么时候不使用模式,而不是使用哪个模式。霍尔构造器是应该的吗