2011-09-02 7 views
5

C#で継承がどのように機能するかに関する理論的/懐疑的な質問があります。C#と継承について

私はいくつかの自動車をモデル化しなければならないとしましょう、私はすべての自動車が実装しなければならないいくつかの一般的な方法があり、パイロットは知っておく必要があります。コードワードでは、これはインタフェースでなければなりません:

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

さて、車のすべての種類は、私はこの時点では、のは、プロパティfuelLevelを言わせて、パイロットが彼らの上に実行できるアクションの横にあるいくつかの共通の技術的な実装を持っている必要がありますまだ車がスピードアップしたり壊れる方法を知りたくありませんので、私は書いているでしょう:

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() { ... } 
} 

、Javaでこれはコードシュウいくつかの構文を変更していますが、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でメソッドをマークする必要があります。

  • プレフィックスインターフェイスIIAutomobile有する:また余談として、C#での命名はわずかに異なっています。
  • 方法に関する大文字:Speedup(),Break()Steer()
+0

を通して私は、これは、Javaと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」(あなたはイタリア語です?)それはどこから来たあなたの前に私達に説明しなければならないので、この方法は、どこにも書かれていません。

のC#では第二に、あなたは抽象メソッドをオーバーライドするとき、あなたは明示的にする必要があり、それオーバーライドキーワード

+0

私はイタリア語です。実際のコードは、この例が理解しやすく説明できるため、投稿と少し異なります。とにかく私はすぐにコードを編集しました... – IssamTP

+0

答えはちょうど私が書いたように(そしてあまりにも)あなたが上書きするキーワードを必要とすることです。 Buona fortuna col codice;) –