【问题标题】:C# how to add inheritance in my hotel management systemC# 如何在我的酒店管理系统中添加继承
【发布时间】:2021-04-14 10:35:21
【问题描述】:

我想在我的酒店管理系统和更多类中添加继承有什么想法吗? 我正在开发控制台应用程序,如果有人可以给我更多添加到这个程序中,我将不胜感激

程序旨在重现一个基本的酒店房间预订方案。创建酒店号实例后,通过调用 checkIn() 方法,程序会检查是否有可用房间,如果有则保留房间。

但是,如果在分配所有房间后,有人从一个房间退房(通过 checkOut() 方法),例如1 号房间,然后尝试入住该房间。当 checkIn() 调用 hasRoomsAvailable() 方法时会出现此问题,在这种情况下,由于 currentRoomNumber 为 5,该方法返回 false 而不是 true。

using System;

namespace HotelManagement
{
    //otel sınıfı
    public class Hotel
    {
        private bool[] available;
        private int totalNumberOfRooms;
        private int currentRoomNumber;

        // oda sayısını bilirleyecek
        private Hotel(int totalNumberOfRooms)
        {
            this.totalNumberOfRooms = totalNumberOfRooms;
            available = new bool[totalNumberOfRooms];

            for (int i = 0; i < totalNumberOfRooms; i++)
                available[i] = true;
        }

        //Returns true if room is available
        private bool hasRoomsAvailable()
        {
            if (currentRoomNumber < totalNumberOfRooms &&
                available[currentRoomNumber])
                return available[currentRoomNumber];
            else
                return false;
        }

        //Time Complexity: O(1)

        //en azından bir oda olup olmadığını kontrol eder ve rezerv eder
        private int checkIn()
        {
            if (hasRoomsAvailable())
            {
                available[currentRoomNumber] = false;
                return ++currentRoomNumber;
            }
            else
                return -1;
        }
        

        //Check out method
        private void checkOut(int roomNumber)
        {
            if (roomNumber <= totalNumberOfRooms && roomNumber != -1)
            {
                if (available[roomNumber - 1] == false)
                {
                    available[roomNumber - 1] = true;
                    Console.WriteLine("Check out oda: {0}", roomNumber);
                }
                else
                    Console.WriteLine("geçersiz Check Out : {0}", roomNumber);
            }
            else
                Console.WriteLine("yanlış oda numarası: {0}", roomNumber);
        }
        //Time Complexity: O(1)

        public static void Main(string[] args)
        {
            //Create an instance of 5 odalı bir otel
            Hotel hotel = new Hotel(5);
            int roomNum = -1;

            if (hotel.hasRoomsAvailable())
            {
                roomNum = hotel.checkIn();
                Console.WriteLine("tahsis edilen oda: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("tahsis edilen oda: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("tahsis edilen oda: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("tahsis edilen oda: {0}", roomNum);

                roomNum = hotel.checkIn();
                Console.WriteLine("tahsis edilen oda: {0}", roomNum);
            }

            hotel.checkOut(1);
            roomNum = hotel.checkIn();

            Console.WriteLine("tahsis edilen oda budur: {0}", roomNum);

            //pause program output on console
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 为什么要添加继承? FCoI 原则说:“优先组合胜于继承”。
  • 好吧,继承假设你甚至一些可以被继承到子类的行为。目前完全不清楚该行为和适当的子类应该是什么。退后一步,在纸上画出你的类结构:你需要哪些对象?他们应该具备哪些属性?它们提供什么功能?它们如何相互关联?这不是一个编程问题,而是一个设计问题。
  • BTW 酒店管理真的很疯狂。您需要能够超额预订酒店,即预订不存在的房间。这有时需要接待员高超的外交技巧:如果没有足够的访问被取消,他们需要将客人转移到另一家酒店,因为没有空房间。
  • 首先,你说你的班级有一个错误 - 那么你的问题主要是关于这个吗?大概您已经通过代码来找出问题所在?您为什么要提出与继承有关的另一个问题?
  • 如果您扩展模型,您可能会认为所有房间都具有某些属性和所有房间共享的某些行为,而有些房间类型具有额外的设施和用途,例如相邻房间,如一个例子。

标签: c# class inheritance


【解决方案1】:

作为一种通用方法,我建议完全按照人类会做的事情进行编程(没有 PC)。他们会在一张纸上写下currentRoomNumber 吗?可能不是。他们会有一张包含所有房间的桌子吗?是的。他们会在有人签入时在该表中添加一个叉号,并在有人签出时将其删除吗?是的。他们如何找到空闲房间?

解决您遇到的问题不需要继承。您正在尝试按房间号的顺序分配房间。您可以使用currentRoomNumber 跟踪这一点。这不是它的工作原理。一个人根据床的数量、面积(平方米)、价格、楼层等来分配房间......

相反,您应该遍历数组bool available[] 并找到一个false。由于这看起来像学习或作业,我将把实现留给你。提示:使用for 循环,跟踪索引,break 退出循环。


对于面向对象的设计,您可以执行以下操作:

  • 写下管理酒店的意义的句子
  • 识别名词,它们将成为类
  • 识别动词,它们将成为方法
  • 检查同义词,例如"room" = "apartment" or "checkout" = "leave" 只选一个字
  • 将动词分配给名词
  • 想想哪个动词需要哪个信息。如果名词自己不知道信息,那将成为参数。

你的 main() 方法看起来很像一个测试。阅读“单元测试”并将测试代码与酒店管理应用程序分开。

【讨论】:

  • 我真的很喜欢你答案底部的抽象 OOP-recipie。要是你早在几年前向我提供这个就好了:D
【解决方案2】:

如果您真的对为什么您的代码不起作用感兴趣 - 当您结帐时,您不会将变量 currentRoomNumber 设置为您刚刚签出的房间号。在您的 checkOut 方法中添加这一行可以解决:

                available[roomNumber - 1] = true;
                currentRoomNumber = roomNumber - 1;
                Console.WriteLine("Check out oda: {0}", roomNumber);

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多