-3

我正在尝试更改我的代码并实现单例设计模式

我有一堂课叫 Room

protected Room()
{

}

public static Room Instance()
{
    if (_instance == null)
    {
        _instance = new Room();
    }
    return _instance;
}

public char room { get; set; }

现在我想从主类中分配一些值

Room myRm = Room.Instance(); 

List<Room> myRoom = new List<Room>();
char[] RoomArray = new char[] { 'A', 'B', 'C', 'D' };               
foreach (char c in RoomArray)
{
    var theroom = myRm.room = c;
    myRoom.Add(theroom); <-----------does not allow me to add some
}

我收到这两个错误

匹配的最佳重载方法 System.Collections.Generic.List<ASR2.Room>.Add(ASR2.Room)有一些无效参数

C:\Project\c-sharp\Assignment1\Asr3\Asr3\Asr.cs

参数 1:无法从 'char' 转换为 'ASR2.Room' C:\Project\c-sharp\Assignment1\Asr3\Asr3\Asr.cs

有人可以帮忙吗?

4

3 回答 3

2

作为试图帮助解决即时编译问题的其他答案的附录,这个答案将解释另一个问题。

我相信您将单例与工厂方法混淆了。单例意味着类要么是静态的,要么在应用程序的整个生命周期中只会被实例化一次,而且只会被实例化一次。工厂方法是一个函数,例如 ,Room.GetNewRoom()它将始终返回一个Room对象的新实例。

目前,您正在调用Room.Instance(),它将始终返回在第一次调用时创建的Room对象(又名 Singleton )的相同实例。但是,在循环内部,您在每次迭代中为单个对象的room属性分配不同的值!

这意味着在循环结束时,单个现有实例Room将仅包含循环中的最后一个值。


现在,开始解决问题。我认为您正在寻找的是一种工厂方法。从您的代码中,我了解到您想要调用一个static将返回一个全新Room对象的函数。

应该是这样的:

public static Room NewRoom()
{
    var result = new Room();
    // do things with result
    return _result;
}

最后,您的循环应如下所示:

foreach (char c in RoomArray)
{
    var theroom = Room.NewRoom();
    theroom.room = c;
    myRoom.Add(theroom);
}
于 2013-08-18T03:02:23.207 回答
1

由于这一行,您正在尝试将 a 添加char到对象列表中:Room

var theroom = myRm.room = c;

c是一个char

不确定,您的意图是什么,但是如果您想要房间列表,请将您的代码更改为:

myRoom.Add(myRm);

但这会给你一个相同实例的列表Room,这不是太有用。

我认为你需要重新考虑你的架构并解释为什么你认为你需要一个单例。单例列表是没有用的。

于 2013-08-18T02:47:06.413 回答
0

从这一行:

var theroom = myRm.room = c;

因此,theroom将是 Char 类型。

以下行是:

myRoom.Add(theroom);

由于myRoomis 是 type List<Room>,因此您不能添加theroomastheroom是 Char ,而不是Room. 并且由于无法将 a 隐式转换Char为 a Room,因此您将收到错误消息:

cannot convert from 'char' to 'ASR2.Room' 
于 2013-08-18T02:51:48.740 回答