Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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_Inheritance_Object_Encapsulation - Fatal编程技术网

C# 传递对象、继承对象或使用直接方法

C# 传递对象、继承对象或使用直接方法,c#,oop,inheritance,object,encapsulation,C#,Oop,Inheritance,Object,Encapsulation,我不熟悉C#和OOP场景,正在构建一个可以帮助我更好地理解OOP概念的基础设施。这是我做的一个项目,用来测试我的课堂知识。有人能仔细检查一下,向我解释一下什么是更好的方法,为什么 以下是我的C#程序中的对象: deskClerk[具有返回Customer对象的addCustomer方法。] 命令 股票 顾客 效用 展厅[包含客户、库存和订单列表-所有列表 私人。展厅也有addCustomer方法] 我希望deskClerk对象将客户添加到Showroom对象。为此,我有以下选择: 我可以将陈

我不熟悉C#和OOP场景,正在构建一个可以帮助我更好地理解OOP概念的基础设施。这是我做的一个项目,用来测试我的课堂知识。有人能仔细检查一下,向我解释一下什么是更好的方法,为什么

以下是我的C#程序中的对象:

  • deskClerk[具有返回Customer对象的addCustomer方法。]
  • 命令
  • 股票
  • 顾客
  • 效用
  • 展厅[包含客户、库存和订单列表-所有列表 私人。展厅也有addCustomer方法]
我希望deskClerk对象将客户添加到Showroom对象。为此,我有以下选择:

  • 我可以将陈列室对象传递给前台职员,然后使用 在展厅内添加客户方法以添加客户
  • 我可以直接将客户添加到展厅,因为展厅对象已经具有addCustomer方法
  • 我可以从Showroom继承deskClerk对象,在这种情况下 deskClerk将能够使用添加到客户列表中 添加陈列室的客户方法
  • 我的问题是:

    • 以上三个选项中,哪一个逻辑合理
    • 展厅是否应该有一个addCustomer方法?陈列室 应该只作为库存、客户和订单列表的存储对象,对吗

    你必须弄清楚,客户是否可以在不参与展示的情况下生存,办公桌职员是否可以在不参与展示的情况下四处游荡

    如果是这样的话,我会这样做

    public class Showroom {
        public DeskClerk Clerk { get; private set; }
        public List<Customer> Customers { get; set; }
        [...]
    }
    
    不要认为有两个位置可以添加客户是正确的,但是桌面职员仍然有责任这样做


    然而,可能误解了您的问题:-)希望它有帮助

    我喜欢你处理这个问题的方法。阅读你的问题:

    • 每个选择都有合理的逻辑,因此您的选择取决于
      如何构造对象以及如何使用对象。作为一名程序员,我建议您使用第二个或第三个

    • 是的,展厅可以有一个AddCustomer方法,在这种情况下,如果您想使用第二个或第三个选项,那么如果您想向存储中添加一个Customer,它必须有一个AddCustomer方法

    使用第三个选项,下面是我的示例代码:

    class Stock { /*...*/ }
    class Customer { /*...*/  }
    class Order { /*...*/  }
    
    class Showroom
    {
        protected List<Stock> StockList;
        protected List<Customer> CustomerList;
        protected List<Order> OrderList;
    
        public Showroom()
        {
            StockList = new List<Stock>();
            CustomerList = new List<Customer>();
            OrderList = new List<Order>();
        }
    
        public virtual void addStock(Stock stock)
        {
            StockList.Add(stock);
        }
    
        public virtual void addCustomer(Customer customer)
        {
            CustomerList.Add(customer);
        }
    
        public virtual void addOrder(Order order)
        {
            OrderList.Add(order);
        }
    
        //...
    }
    
    class deskClerk : Showroom
    {
        public deskClerk()
        {
            CustomerList = new List<Customer>();
        }
    
        public override void addCustomer(Customer customer)
        {
            CustomerList.Add(customer);
        }
    
        //...
    }
    
    类股票{/*…*/}
    类客户{/*…*/}
    类顺序{/*…*/}
    班级陈列室
    {
    受保护名单;
    受保护名单客户名单;
    受保护列表订单列表;
    公共陈列室()
    {
    StockList=新列表();
    CustomerList=新列表();
    OrderList=新列表();
    }
    公共虚拟无效addStock(股票)
    {
    股票列表。添加(股票);
    }
    公共虚拟客户(客户)
    {
    CustomerList.Add(客户);
    }
    公共虚拟无效添加订单(订单)
    {
    OrderList.Add(订单);
    }
    //...
    }
    班级职员:陈列室
    {
    办公桌文员()
    {
    CustomerList=新列表();
    }
    公共覆盖无效添加客户(客户客户)
    {
    CustomerList.Add(客户);
    }
    //...
    }
    
    所以我可以再给你提一件事:


    每次处理对象时,都会给每个对象分配角色和任务,然后每个选择都取决于您想要使用的逻辑。选择一个你认为有效且适合你想要使用它的环境。

    你能告诉我更多关于你试图解决的现实问题吗?什么是甲板文员、客户和陈列室课程?柜台职员是干什么的?陈列室做什么?为什么它必须了解客户、库存和订单?客户、库存和订单是如何关联的?这是s的汽车展示厅软件模型,汽车展示厅肯定会有一个每天销售的“deskClerk”,以及一个可以评估销售的“StoreManager”。deskClerk需要有限的方法来访问他有权访问的字段。感谢您的解决方案,我最终没有从展厅继承deskClerk,因为即使没有展厅deskClerk也没用,deskClerk也可以为“任何”展厅工作。例如,一个电视遥控器和一个电视,一个电视遥控器能够与任何电视一起工作(忽略IR协议),因此从电视继承它将破坏制作电视遥控器的一般用途。然而,在TVRemote的构造函数中将TV设置为依赖项将更合适,以便远程设备知道为哪个TV工作。:)是的,你的推理是无可挑剔的,但在这种情况下,说到我的代码,
    deskClerk
    可能只是一个实用工具。使用您的代码的人可以直接使用
    展厅
    。感谢您的解决方案,我最终使用了这个。如果您想知道我这样做的原因,请阅读我对@Fuex解决方案的评论:)
    class Stock { /*...*/ }
    class Customer { /*...*/  }
    class Order { /*...*/  }
    
    class Showroom
    {
        protected List<Stock> StockList;
        protected List<Customer> CustomerList;
        protected List<Order> OrderList;
    
        public Showroom()
        {
            StockList = new List<Stock>();
            CustomerList = new List<Customer>();
            OrderList = new List<Order>();
        }
    
        public virtual void addStock(Stock stock)
        {
            StockList.Add(stock);
        }
    
        public virtual void addCustomer(Customer customer)
        {
            CustomerList.Add(customer);
        }
    
        public virtual void addOrder(Order order)
        {
            OrderList.Add(order);
        }
    
        //...
    }
    
    class deskClerk : Showroom
    {
        public deskClerk()
        {
            CustomerList = new List<Customer>();
        }
    
        public override void addCustomer(Customer customer)
        {
            CustomerList.Add(customer);
        }
    
        //...
    }