2011-09-02 6 views
5

C#에서 상속이 어떻게 작동하는지에 대한 이론적 인/도덕적 인 질문이 있습니다.C# 및 상속 정보

일부 자동차를 모델해야한다고 가정 해 보겠습니다. 따라서 모든 자동차가 구현해야하는 몇 가지 일반적인 방법이 있으며 조종사는 알아야합니다.

interface Automobile { 
    void speedup(); 
    void break(); 
    void steer(); 
    //bla bla 
} 

이제 자동차의 모든 종류의이 속성 fuelLevel 말을하자, 조종사가 그들을 수행 할 수있는 작업 옆에 몇 가지 일반적인 기술 구현을해야한다,이 점 I에서 : 코드 즉 이것은 인터페이스해야 여전히 차가 속도 또는 분해 방법을 알고 싶지 않아, 그래서 내가 쓴 것 :

abstract class Car : Automobile { 
    int fuelLevel; // for example.... 
    public abstract void speedup(); 
    public abstract void break(); 
    public abstract void steer(); 
} 

가 지금은 페라리를 모델링 할, 그래서 :

class Ferrari : Car { 
    public void speedup() { ... } 
    public void break() { ... } 
    public void steer() { ... } 
} 

이제 자바이에 코드 슈 (구문을 바꾼다)하지만, C#에서는 다음과 같은 이유로 작업하지 않을 것이다 :

Error 1 'Ferrari' does not implement inherited abstract member 'Car.speedup()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.break()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.steer()' 

왜? 이 문제를 어떻게 해결해야합니까? 당신이 설정하고, 그 외에는

class Ferrari : Car 
{ 
    public override void speedup() { } 
    public override void break() { } 
    public override void steer() { } 
} 

- Ferrari 클래스는 방법이 도출된다하더라도, 당신의 인터페이스를 만족 :

답변

16

당신은 아래 abstract 정의를 다루 override와 방법을 표시해야합니다.

  • 프리픽스 인터페이스 I, IAutomobile와 : 또한 제쳐두고, C#으로 명명 다소 다르다.
  • 방법상의 대문자 : Speedup(), Break(), Steer().
+0

을 통해 나는이 자바와 C#의 차이점 중 하나입니다 생각합니다 ... 정말 감사합니다. – IssamTP

+0

@ amod0017 완료. 늦어서 미안하지만 여기에 7 분 정도 기다리는 것이 바쁩니다 ... – IssamTP

+0

@IssamTP는 실제로 사이트에있는 시간에 따라 대답하는데 3 분 밖에 걸리지 않습니다 :-) –

3

실제로는 추상 클래스 멤버를 무시하는 것을 무시하고 있습니다. 같은 것을 고려해보십시오 :

interface IAutomobile 
{ 
    void Steer(); 
    void Break(); 
} 

abstract class Car : IAutomobile 
{ 
    public abstract void Steer(); 
    public abstract void Break(); 
} 

class Ferrari : Car 
{ 
    public override void Steer() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void Break() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

왜 "새 던지기"? – IssamTP

+0

@IssamTP는 메소드의 자동 기본 구현이므로 구현을 제공하지 않아도 메소드가 값을 반환해야하는지 여부와 관계없이 컴파일됩니다. – TrymBeast

1

아니라, "disconnetti"(당신은 이탈리아어입니까?)이 어디에서 오는지 당신이 전에 우리를 설명해야한다, 그래서 방법은, 어디서든 기록되지 않습니다. 당신이 추상 메소드를 오버라이드 (override) C#에서

둘째, 당신은 명시 적으로는 재정 키워드

+0

그래,이 예제는 이해하기 쉽고 설명하기 쉽기 때문에 이탈리아어입니다. 실제 코드는 게시 된 코드와 약간 다릅니다.어쨌든 나는 곧 코드를 편집했습니다 ... – IssamTP

+0

그래, 대답은 내가 작성한 것처럼 다른 방법으로도 키워드를 재정의해야한다는 것입니다. Buona fortuna col codice;) –