2016-10-29 3 views
0

私はhttps://www3.ntu.edu.sgからOOPエクササイズをしています.1つの継承問題を理解することはできません。スーパークラスcircleとサブクラスcylinderextendscircleの2つのクラスがあります。Javaサブクラスはsuper.tostring()を使用しますが、スーパークラスのメソッドは使用しません。どうして?

サークル: - 両方の領域cylinder領域を印刷

public double getArea() { 
     return Math.PI*radius*radius; 
} 
public String toString() { 
     return "Circle Area: "+this.getArea()"; 
} 

シリンダサークル

@Override 
    public double getArea() { 
     // TODO Auto-generated method stub 
     return super.getArea()*2+super.getCircumference()*height; 
    } 

    @Override 
    public String toString() { 
     return "Cylinder["+super.toString+"]"+"Cylinder area="+getArea()+"]"; 
    } 
Cylinderクラスから getArea()を用い

新しいオブジェクトタイプCylinderプリントsuper.toString()を拡張します。どうすればスーパークラス(CirclesgetArea()super.toStringで使用できますか?

ありがとうございます!

+0

それが基本のJavaのセマンティクス(多型)の違反になりますので、あなたがそれをすることはできません。

回避策はCircleクラスをこのように変更することができます。あなたの主な間違いは、 'Cylinder'を' Circle'のサブクラスにすることです。明らかにそうではありません。私は見る。 –

+0

それが私が探していた答えです。ありがとう! –

+0

サークルは実際にはシリンダーの特殊ケースで、高さはゼロです。 –

答えて

0

ランタイム中にthisは、オブジェクトの現在のインスタンスを表し、getArea()メソッドを持つCylinderです。したがって、相続はここで私たちを助けません。

private double getCircleArea() { 
     return Math.PI*radius*radius; 
} 

public double getArea() { 
     return getCircleArea(); 
} 

public String toString() { 
     return "Circle Area: " + this.getCircleArea(); 
} 
+0

私は、getArea()メソッドをオーバーライドするabsractクラスの "Shape"があると思うので、サークルをもう拡張しません。円柱には円のオブジェクトである底辺があります。だから私はCylinderクラスで{Circle base = new Circle(radius)}を使うだけで、toStringは動作します - それ以上のgetArea()のオーバーライドがないのでです。ありがとう! –

関連する問題