2015-01-19 2 views
0

다른 클래스가 작동해야하는 클래스를 올바르게 선언하는 적절한 방법은 무엇입니까? 예를 들어C에서 함수 - 구성 요소 관계를 수행하는 방법

,

public class Car 
{ 
    IEngine Engine { get; set; } 
} 

interface IEngine 
{ 
    void go(); 
} 

public class DieselEngine 
{ 
    void go() {} 
} 

자동차 클래스는 객체의 기능의 대부분을 정의합니다. 그러나 일부 기능은 일부 인터페이스를 지원하는 하위 오브젝트로 위임됩니다.

올바른 방법인가요? 자동차를 추상화해야합니까? 또는 엔진? 아니면 둘다? 아마도 IEngine을 버리고 DieselCar를 하위 클래스로 만들어야할까요?

public class Car 
{ 
    abstract void go(); 
} 

public class DieselCar : Car 
{ 
    void go() {} 
} 

다른 방법으로이 작업을 수행 할 수 있습니까? 그리고 그것은 최고의 하나입니까?

+1

여러 유형의 '자동차'를 사용하려는 경우이 방법을 사용하면됩니다. 그런 다음 상속을 극대화하기 위해 추상 팩토리 디자인 패턴을 구현할 수 있습니다. 최선의 것은 귀하의 상황에 달려 있습니다. –

답변

1
당신은 파생 클래스로 Abstract Factory Design Pattern

문제를 찾고 있습니다

하면 추가 매개 변수가있는 경우 것입니다. 당신이 유도를 통해 2 도어와 4 도어 차량을했다 예를 들어, 당신은 지금 4 개 수업이있을 수 있습니다

  • DieselFourDoorBodyCar
  • GasFourDoorBodyCar을
  • DieselTwoDoorBodyCar
  • GasTwoDoorBodyCar

당신에게 이것이 추가 속성으로 제어 불능 상태로 빠르게 돌아갈 것임을 알 수 있습니다. 추상 팩토리는 일부 유형의 빌더 스펙을 통해 생성 된 클래스에 대해 서로 다른 교환 가능 구성 요소를 지정하는 방법입니다.

1

당신은 같은 것을 할 수있는 :

public interface IEngine 
{ 
    void Start(); 
} 

public class Engine : IEngine 
{ 
    public bool IsRunning { get; private set; } 

    public void Start() 
    { 
     // Do the common start here 
     IsRunning = true; 
    } 
} 

public class DieselEngine : Engine 
{ 
    public void Start() 
    { 
     // Do some deisel start stuff here 
     WaitForGlowPlug(); 

     // Now start 
     base.Start(); 
    } 

    private void WaitForGlowPlug() 
    { 
     // Do something 
    } 
} 

public class Car 
{ 
    private IEngine _engine; 

    public IEngine Engine 
    { 
     get { return _engine; } 
     set { if (value != null) _engine = value; } 
    } 

    public Car() 
    { 
     Engine = new Engine(); 
    } 
} 

private static void Main() 
{ 
    Car dieselCar = new Car 
    { 
     Engine = new DieselEngine() 
    }; 

    dieselCar.Engine.Start(); 
} 

을하지만 실제로는, 당신은 다른 차량보다 디젤 자동차가 다른 점은 무엇인지 볼 필요가있다. 엔진 이상인 경우 기본 Car 클래스 (또는 ICar 인터페이스)를 만들고 Car에서 상속 한 DieselCar 클래스를 만들 수 있습니다. 얼마나 세분화되어 있는지에 따라 다릅니다.

+0

Engine with Car = null을 허용하고 싶지 않으면 어떻게합니까? 그 것을 막는 가장 좋은 방법은 무엇입니까? –

+0

한 가지 방법은이 속성을 생성자의 일부 기본값으로 설정하고 set 코드에서 null 값을 허용하지 않는 것입니다. 이 주석을 반영하도록 클래스를 업데이트했습니다. –

+0

또 다른 방법은 공용 API에서 생성자를 숨김으로써 유효한 객체의 생성을 강제하는 빌더 메소드 세트를 개발하는 것입니다. –

1

간단하게 유지하십시오. 내가 생성자에게 그것은 '기능'할 필요가 어떤 클래스의 사용자에게 전달 또한 클래스의 생성을 제한하고하는 가장 좋은 방법 찾기 : 여기에서

public Car(IEngine engine) 
{ 
    Contract.Requires(engine != null; 
} 

을 제어 읽기 전용을 통해 발휘 될 수있다 속성 또는 유효성 확인으로 가져 오기를 클릭합니다.

내가 제기하는 질문에 대한 가장 흥미로운 점은 클래스를 디자인하여 클래스 요구 사항을 명확하고 직관적으로 전달하는 것입니다.

관련 문제