2012-03-11 3 views
3

OOP 개념을 이해하는 데 도움이되는 인프라 구축에 익숙한 C# 및 OOP 시나리오가 처음입니다. 이것은 내가 강의실 지식을 테스트하기 위해 만든 프로젝트입니다. 누군가가이 문제를 검토하고 나에게 더 나은 접근 방법과 이유를 설명 할 수 있습니까? 다음개체 전달, 상속 또는 직접 메서드 사용

내 C# 프로그램에서 객체 :

  • deskClerk [. 고객 객체를 반환 AddCustomer와 방법이 있습니다]
  • 주문
  • 증권
  • 고객
  • 유틸리티
  • 쇼룸 [고객, 재고 및 주문 목록 포함 - 모든 목록 비공개. Showroom에는 addCustomer 메소드가 있습니다.

DeskClerk 객체로 고객을 Showroom 객체에 추가하려고합니다. 이를 위해 나는 다음과 같은 선택 사항이 있습니다

  1. 내가 고객을 추가 쇼룸 내부의 AddCustomer와 방법을 활용 다음 deskClerk에 쇼룸 개체를 전달할 수 있습니다.
  2. Showroom 객체에 이미 addCustomer 메서드가 있으므로 고객을 직접 Showroom에 추가 할 수 있습니다.
  3. deskroom에서 deskClerk이 Showroom의 addCustomer 메소드를 사용하여 고객 목록에 추가 할 수있는 경우에 ShowClerk 객체를 상속 할 수 있습니다.

내 질문은 : 위의 사운드 로직을 가지고있는 세 가지 선택의

  • ?
  • Showroom에도 addCustomer 메서드가 있어야합니까? 쇼룸 은 주식, 고객 및 주문 목록의 저장 개체 일뿐입니다. 맞습니까?
+1

해결하려는 실제 문제에 대해 자세히 알 수 있습니까? DeckClerk, Customer 및 Showroom 클래스 란 무엇입니까? DeskClerk의 기능은 무엇입니까? 쇼룸은 무엇을합니까? 왜 고객과 주식 및 주문에 대해 알아야합니까? 고객, 주식 및 주문은 어떻게 관련되어 있습니까? –

+0

이것은 자동차 쇼룸을위한 소프트웨어 모델입니다. 자동차 쇼룸에는 매일 판매되는 "deskClerk"와 판매 등을 평가할 수있는 "StoreManager"가 있습니다. deskClerk는 자신이 소유 한 필드에만 액세스 할 수있는 제한된 방법이 필요합니다. 액세스 권한. – adeelx

답변

1

고객이 쇼룸에 참여하지 않고 존재할 수 있고 DeskCerk가 쇼룸에 참여하지 않고 떠 다니는 경우 운동 할 수 있습니다.

즉 scenraio이 있다면 나는 책상 서기는 쇼룸없이 많이 사용되지 않을 것이

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은 여전히 ​​그렇게해야합니다.

그러나 문제를 오해했을 수도 있습니다 .-) 도움이 되길 바랍니다.

+0

솔루션을 제공해 주셔서 감사합니다. 내 이유를 원한다면 @ Fuex 's Solution에 대한 내 의견을 읽어주세요. – adeelx

1

나는이 문제에 대한 귀하의 접근 방식을 좋아합니다.그래서 귀하의 질문에 읽기 :이 선택의

  • 각을 그래서 당신의 선택은 당신이 당신의 객체를 구성 할 방법 당신이 그들을 사용하는 방법을
    에 따라, 사운드 논리를 가지고있다. 프로그래머라면 두 번째 또는 세 번째를 사용하는 것이 좋습니다.

  • 예, 쇼룸에는 addCostumer 메소드가있을 수 있습니다.이 경우 두 번째 또는 세 번째 선택기를 사용하려는 경우 Costumer를 스토리지에 추가하려면 addCostumer 메소드가 있어야합니다.

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

    그래서 내가 당신에게 또 다른 한가지 권하고 있습니다 : 여기에 세 번째의 choise를 사용

내 샘플 코드 각자 자신의 역할에 부여

때마다 당신은 객체와 작동을하고 그의 업무, 그리고 모든 선택은 당신이 사용하기를 원하는 논리에 달려 있습니다. 당신이 그것을 사용하고자하는 맥락에서 잘 작동하고 잘 맞을 것이라고 생각하는 것을 선택하십시오.

+1

솔루션을 제공해 주셔서 감사합니다. 책상을 상속하지 못했습니다. 데스크 룸에서 데스크 클러크는 Showroom, deskClerk는 "ANY"쇼룸에서 일할 수 있습니다. 예를 들어, TV 리모컨과 TV, TV 리모컨은 어떤 TV (IR 프로토콜 무시)와도 작업 할 수 있으므로 TV에서 상속하면 TVRemote가 만들어진 일반적인 목적을 무효화합니다. 반면, TV를 TVRemote의 생성자에 종속시키는 것이 더 적합하므로 원격이 어떤 TV를 사용해야하는지 알 수 있습니다. :) – adeelx

+1

네, 추론 할 수는 없지만,이 경우에는 내 코드에 대해 'deskClerk'는 유틸리티 일뿐입니다. 누가 코드를 사용하면 누가 직접 '쇼룸'을 사용할 수 있습니다. –