You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从一个类获取另一个类新实例的字段?酒店预订系统代码疑问

我来帮你搞定这两个问题哈~

问题1:如何从一个类获取另一个类新实例的字段

核心取决于两个类的访问权限以及目标字段的修饰符,分几种常见情况:

  • 如果字段是公共(public)的:直接在当前类中创建目标类的实例,通过「实例名.字段名」就能访问。举个例子:
// 目标类,包含要访问的字段
public class Room
{
    public int RoomNumber;
    public bool IsBooked;
}

// 另一个需要获取字段的类
public class BookingSystem
{
    public void CheckRoomInfo()
    {
        // 创建Room的新实例并赋值
        var newRoom = new Room { RoomNumber = 101, IsBooked = false };
        // 直接获取字段值
        Console.WriteLine($"房间号:{newRoom.RoomNumber},预订状态:{newRoom.IsBooked}");
    }
}
  • 如果字段是私有(private)的:不能直接访问,这时候推荐给目标类添加公共属性(Property)或者方法来暴露字段值,这也是面向对象封装的最佳实践:
public class Room
{
    private bool _isBooked; // 私有字段

    // 用公共属性对外暴露私有字段
    public bool IsBooked
    {
        get { return _isBooked; }
        set { _isBooked = value; }
    }
}

public class BookingSystem
{
    public void CheckRoomStatus()
    {
        var newRoom = new Room();
        newRoom.IsBooked = true;
        Console.WriteLine($"房间是否已预订:{newRoom.IsBooked}");
    }
}
  • 如果是静态字段:不需要创建实例,直接用「类名.字段名」访问即可:
public class Room
{
    public static string HotelName = "阳光假日酒店";
}

public class BookingSystem
{
    public void ShowHotelInfo()
    {
        Console.WriteLine($"酒店名称:{Room.HotelName}");
    }
}
问题2:酒店预订系统的入住/退房逻辑优化

你现在的switch语句存在重复逻辑,而且房间状态检查的if(true)明显是占位错误,我给你梳理下优化方案:

第一步:统一管理房间状态

不要每个case单独处理,用集合(比如List)来管理所有房间的状态,避免重复代码。先定义一个Room类:

public class Room
{
    public int RoomNumber { get; set; }
    public bool IsBooked { get; set; }

    // 构造函数初始化房间号,默认未预订
    public Room(int roomNumber)
    {
        RoomNumber = roomNumber;
        IsBooked = false;
    }
}

然后在预订系统中初始化所有房间:

public class HotelBookingSystem
{
    private List<Room> _rooms;

    public HotelBookingSystem()
    {
        // 初始化1-5号房间,可根据需求扩展
        _rooms = new List<Room>
        {
            new Room(1),
            new Room(2),
            new Room(3),
            new Room(4),
            new Room(5)
        };
    }

第二步:抽离重复的入住/退房逻辑

把每个case里的检查和操作抽成单独的方法,减少代码冗余:

// 入住方法
    public void CheckInRoom(int roomNumber)
    {
        var targetRoom = _rooms.FirstOrDefault(r => r.RoomNumber == roomNumber);
        if (targetRoom == null)
        {
            Console.WriteLine("不存在该房间,请重新选择!");
            return;
        }

        if (targetRoom.IsBooked)
        {
            Console.WriteLine($"房间{roomNumber}已被预订,请选择其他房间!");
        }
        else
        {
            targetRoom.IsBooked = true;
            Console.WriteLine($"成功入住房间{roomNumber}!");
        }
    }

    // 退房方法
    public void CheckOutRoom(int roomNumber)
    {
        var targetRoom = _rooms.FirstOrDefault(r => r.RoomNumber == roomNumber);
        if (targetRoom == null)
        {
            Console.WriteLine("不存在该房间,请重新选择!");
            return;
        }

        if (!targetRoom.IsBooked)
        {
            Console.WriteLine($"房间{roomNumber}未被预订,无法退房!");
        }
        else
        {
            targetRoom.IsBooked = false;
            Console.WriteLine($"成功退房房间{roomNumber}!");
        }
    }

第三步:简化switch语句

现在switch里只需要调用对应的方法即可,逻辑清晰且无重复:

public void RunBookingMenu()
    {
        while (true)
        {
            Console.WriteLine("\n=== 酒店预订系统 ===");
            Console.WriteLine("1. 入住房间1");
            Console.WriteLine("2. 入住房间2");
            Console.WriteLine("3. 退房房间1");
            Console.WriteLine("4. 退房房间2");
            Console.WriteLine("5. 退出系统");
            Console.Write("请输入选择:");

            if (!int.TryParse(Console.ReadLine(), out int choice))
            {
                Console.WriteLine("输入无效,请输入数字!");
                continue;
            }

            switch (choice)
            {
                case 1:
                    CheckInRoom(1);
                    break;
                case 2:
                    CheckInRoom(2);
                    break;
                case 3:
                    CheckOutRoom(1);
                    break;
                case 4:
                    CheckOutRoom(2);
                    break;
                case 5:
                    Console.WriteLine("感谢使用,再见!");
                    return;
                default:
                    Console.WriteLine("选项无效,请重新输入!");
                    break;
            }
        }
    }
}

这样不管后续扩展多少房间,只需要在菜单和switch里新增对应的调用即可,维护起来更方便。

内容的提问来源于stack exchange,提问作者Asking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:15