2012-08-06 2 views
7

나는 추상Vehicle 클래스와 자동차, 트럭, 오토바이 추상 클래스 Vehicle에서 파생 된 클래스가 있다고 가정합니다. 또한 나는 트럭과 오토바이를 위해서 연료가 공급 된 자동차 나 전기 기반의 자동차 등을 만들 수 있어야한다고 상상해보십시오. (구체적인 클래스)다른 서명으로 다형 메서드를 만들 수있는 방법

두 질문 :

1.Consider 내가 다형성 방법으로, 그것이 무엇인지 모른 채 차량에 에너지를 채우려. 예를 들어 차량 연료 I 연료로 충전 할 기반으로하는 경우 상기 방법은 3 개 개의 매개 변수와 같아야 void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

가 있지만 electricy 기반 차량용 I는 연료 종류없이 거의 동일한 기능 signture 이번에 필요
물론, 예를 들어 (2 개 매개 변수) :

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 

나는 위의 제약 조건을 polymorhic FillUpEnergy 방법을 할 수 있습니까? (다른 방법의 서명) 모든 콘크리트 클래스가 FuelEngine 또는 ElectricEngine (엔진에서 파생 내가 가진 다른 구체적인 클래스)를 나타냅니다 Engine에 대한 참조 (다른 추상 클래스)를 잡아 내 구현 2.In

. 예를 들어 ElectricEngine에 대한 참조를 보유하고있는 ElectricCar이라는 구체적인 클래스가 있습니다.
이 아키텍처가 충분히 좋습니까? 아니면 차고 시스템을 구현하는 더 나은 방법이 있습니까?

+1

내가 아주 일을하지 않는 호출 myCar.FillUpEnergy(myProvider)

  • 호출합니다. –

  • +0

    브릿지 패턴이 저의 첫 번째 생각이었습니다. –

    답변

    8

    당신은 다른 서명 다형성 "푸시 스타일"방법을 만들 수 없습니다,하지만 당신은 잘 공개 Visitor Pattern를 사용하여 다형성 "풀 스타일"방법을 만들 수 있습니다.

    아이디어는 상호 작용의 순서를 반전하고, 자동차 객체가 수행 할 작업을 결정하게하는 대신 당신이 필요로 생각 차를 제공 FillUpEnergy를 호출, FillUpEnergy를 호출하고 을 차를 할 것 그것은 다음과 같이해야합니다 알고 :

    이제 다형성 메소드의 서명은 고정되어 있지만, 방법의 파견은 두 다리 대신 하나를 취
    interface IEnergyProvider { 
        void TakeFuel(EfuelType i_fuelType, int amounOfEnergy); 
        void TakeElectricity(int amounOfEnergy); 
    } 
    interface ICar { 
        void FillUpEnergy(IEnergyProvider provider); 
    } 
    

    :

      ,536을
    • 당신은 자동차, 그것은 다리라고하고 디자인 패턴 중 하나 있어요) 2에 관해서는) myProvider.TakeFuel 또는 myProvider.TakeElectricity
    +2

    멋진 답변! – dash

    +1

    이지만 옛날 아바타를 놓치지 만, 방문객은 불필요하게 복잡하지 않습니까? 전기를 가져오고 다른 종류의 연료를 복용하는 것과 같은 개념이 같은 개념처럼 들립니다 ... –

    +0

    @Sebastian 방문자 패턴에 대해 절대적으로 옳습니다. 손을 쉽게 뗄 수 있습니다. 특히 확장 성을 유지해야하는 경우가 있습니다. 하지만 이처럼 선행 적으로 지정할 수있는 계층 구조의 경우 큰 문제가 아닙니다. 단지 몇 가지 방법 만 사용하면 마음 속의 상호 작용을 통해 걷는 것이 쉽지 않습니다. 가스와 전기를 같은 개념으로 삼는 한, 필자는 단일 'FillUpEnergy'방법을 제공함으로써 디자인에 반영한다고 생각합니다. – dasblinkenlight

    3

    에 관한 질문 1)

    (객체 지향 설계 등의 측면에서) 당신은 fueltype의 전기/가솔린 부분을 만들 수 및 도메인 로직이 처리합니다.

    C#은 다른 서명으로 다형성을 제공하지 않습니다. 이 캡슐의 정확히 위반 때문에

    2), 구성

    0
    1. 당신은 할 수 없습니다라고합니다.
    2. 나는 엔진에 관한 당신의 질문을 이해하지 못한다. 그러나 나는 많은 "차고 시스템"이 있기 때문에 "차고 시스템"을 구현하는 더 좋은 방법이 많이있을 수 있다고 분명히 말할 수있다. 사실 요구 사항을 잘 이해할 때까지는 OOP 또는 다른 용어로 시스템을 모델링하지 말아야한다는 것을 의미합니다.
    1

    ElectricCarFueledCar과 구별됩니까? 엔진 외에는 (개념적으로) :

    interface IEngine 
    { 
        void FillUpFuel(int amountOfFuel, int maxAmountOfFuel); 
    } 
    
    class ElectricEngine : IEngine 
    { 
        public void FillUpFuel(int amountOfFuel, int maxAmountOfFuel) { ... } 
    } 
    
    abstract class Vehicle 
    { 
        public abstract IEngine Engine { get; } 
    } 
    
    class Car : Vehicle 
    { 
        public IEngine _engine; 
        public override IEngine Engine { get { return _engine; } } 
    
        public Car(IEngine engine) 
        { 
         _engine = engine; 
        } 
    } 
    ... 
    var electricCar = new Car(new ElectricEngine()); 
    electricCar.Engine.FillUpFuel(40, 70); 
    

    일반적인 구성과 상속의 예. ElectricEngine이 연료를 채우는 것에 따라 명명은 약간 이상합니다 ... 그러나 그것은 요점이 아닙니다. 약

    0

    1)
    다형성 FillUpEnergy (subtype polymorphism을 갖는 점은) 당신이 알고있는 유일한 것은이 객체가 Vehicle이라고 때이 메소드를 호출 할 수있다.

    올바른 인수 집합을 선택하기 위해 정확한 형식을 알아야하는 경우이 함수는 다형성 일 필요가 없습니다.

    약 2)
    아무것도의 충격적인

    관련 문제