2017-10-07 5 views
-1
내가 인터페이스에 대해 학습 된

매개 변수 내 질문은 : 예를 들어 I라는 Car 클래스가 있습니다 ICar인터페이스 회원 서명

public class Car: ICar 
Car

ICarSave 있습니다라는 인터페이스를 구현 Car을 방법 :

public bool Save(Car car) 
    {some save logic} 

Save 방법에 통과해야 Car 또는 ICar이 더 나은 관행입니까, 아니면 중요하지 않습니까? ICar을 생각하고있었습니다. 왜냐하면이 인터페이스가 다른 클래스에 의해 상속되면 여전히 작동하기 때문입니다.

감사의 말씀 감사드립니다.

+2

는'Save' 방법'ICar' 인터페이스의 일부인가? 그런데 왜 ICar의 다른 인스턴스를 전달합니까? – orhtej2

+0

@ orhtej2 좋은 지적. 이미 현재 인스턴스가 있기 때문에 필요하지 않으므로 ICar를 제거했습니다. 당신의 도움을 주셔서 감사합니다. –

답변

2

이런 식으로 생각해 : ICar가 매개 변수로 Car 예상 경우 당신이 인터페이스를 사용할 때 원했던 것입니다 디커플링 동안 ICarCar에 명시 적으로 따라 할 것입니다.

ICar 경우 Car에 따라 달라집니다 Car (예를 들어, 너무 일반적인 것으로 간주) 사용되지 않는

public interface ICar 
{ 
    void Save(Car car); 
} 

public class Car : ICar 
{ 
    public void Save(Car car) { } 
} 

public class Van : ICar 
{ 
    // Here Van needs to have a Car object, why should it? 
    public void Save(Car car) { } 
} 

경우, 당신은 당신의 전체 코드를 리팩토링해야 할 것입니다. ICarICar에 의존하는 경우

대신 :

public interface ICar 
{ 
    void Save(ICar car); 
} 

public class Car : ICar 
{ 
    public void Save(ICar car) { } 
} 

public class Van : ICar 
{ 
    public void Save(ICar car) { } 
} 

을 여기에 Car가 존재하는 경우, 정말 전혀 문제가되지 않습니다 여부, 당신은 그것의 구현에 결합 수 없습니다.

그러나 ICar을 구현하면 이미 ICar이되므로 매개 변수로 전달할 필요가 없습니다.

고려 :

public interface ICar 
{ 
    // Will save myself 
    void Save(); 
} 

수스 :

public interface ICar 
{ 
    // Will save some ICar 
    void Save(ICar car); 
} 
+0

컴파일 오류가 있습니다. 공용 인터페이스 ICar {void Save (ICar car);} 공용 클래스 Car : ICar {public void Save (자동차) {}} – selami

+0

@selami 산만 해지고 고정되었습니다. –

+0

@CamiloTerevinto 완벽하게 설명하고 정확히 내가 뭘 찾고 있었는지, 고마워. –