如何从一个类获取另一个类新实例的字段?酒店预订系统代码疑问
我来帮你搞定这两个问题哈~
问题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
相关产品推荐
相关产品推荐

