传递一个Object,继承它或使用直接方法

时间:2012-03-11 10:09:00

标签: c# oop inheritance object encapsulation

我是C#和OOP场景的新手,在构建基础架构的过程中,这将帮助我更好地理解OOP概念。这是我用来测试课堂知识的项目。有人可以回过头来向我解释什么是更好的方法,为什么?

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

  • deskClerk [具有返回Customer对象的addCustomer方法。]
  • 顺序
  • 库存
  • 客户
  • 效用
  • 陈列室[包含客户,库存和订单列表 - 所有列表 私人的。陈列室还有addCustomer方法]

我希望deskClerk对象将一个Customer添加到Showroom对象。为此,我有以下选择:

  1. 我可以将一个Showroom对象传递给deskClerk,然后使用 在Showroom中添加addCustomer方法以添加客户。
  2. 我可以直接将客户添加到展厅,因为Showroom对象已经有了addCustomer方法。
  3. 我可以从Showroom继承deskClerk对象,在这种情况下 deskClerk将能够使用添加到客户列表 陈列室的addCustomer方法。
  4. 我的问题是:

    • 上述三个选择中哪一个有合理的逻辑?
    • 展厅是否应该使用addCustomer方法?陈列室 应该只是Stock,Customer和Order列表的存储对象,对吗?

2 个答案:

答案 0 :(得分:1)

如果客户可以在不参加陈列室的情况下存在,并且如果DeskClerk可以漂浮在展厅中,那么你必须确定。

如果那是风景,我会做这样的事情

public class Showroom {
    public DeskClerk Clerk { get; private set; }
    public List<Customer> Customers { get; set; }
    [...]
}

如果没有陈列室,桌面服务员就没什么用处,所以将陈列室设置为构造者的依赖:

public class DeskClerk {
    private ShowRoom { get; set; }
    public DeskClerk(ShowRoom showRoom) {
        ShowRoom = showRoom;
    }
    public Customer AddCustomer(Customer customer) {
        //do stuff with customer object
        ShowRoom.Add(customer);
        return cutomer;
    }
}

不要认为有2个地方可以添加客户是正确的,但DeskClerk仍然有责任这样做。

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

答案 1 :(得分:1)

我喜欢你解决问题的方法。所以阅读你的问题:

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

  • 是的,Showroom可以有一个addCostumer方法,在这种情况下,如果你想使用第二个或第三个选择,它必须有一个addCostumer方法,如果你想将一个Costumer添加到存储中。

使用第三个选择是我的示例代码:

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);
    }

    //...
}

所以我可以推荐你另一件事:

每次你使用对象时,都会向每个对象提供他的角色和任务,然后每个选择都取决于你想要使用的逻辑。选择您认为可以使用的那个并且适合您想要使用它的上下文。