2016-03-24 15 views
0
import java.lang.Math; 

public class FiguraProba 
{ 

    public abstract class Figura { 
    public abstract double pole(); 
    public abstract double obwod(); 
    } 

    public abstract class Czworokat extends Figura { 
    public double obwod(double bok1, double bok2, double bok3, double bok4) 
    { 
     return (bok1+bok2+bok3+bok4); 
    } 

    public abstract double pole(); 
    } 

    public class Kwadrat extends Czworokat { 

    double bok1; 

    public Kwadrat(double bokPodany) 
    { 
     bok1=bokPodany; 
    } 

    public double pole(double bok1) { 
     return bok1*bok1; 
    } 
    } 

    public class Prostokat extends Czworokat { 

    double bok1, bok2; 

    public Prostokat(double bokPodany1, double bokPodany2) 
    { 
     bok1=bokPodany1; 
     bok2=bokPodany2; 
    } 
    public double pole(double bok1, double bok2) { 
     return bok1*bok2; 
    } 
    } 

    public static void main(String args[]) 
    { 
    //System.out.println(Math.sin(90*(Math.PI/180))); 
    } 
} 

私は英語の変数名を使用しています。私の目標は:私は5面のオブジェクトf.equaresExampleを持っています。クラスsquareから領域を計算する関数を呼び出し、perimeterクラスをクラスquadrangeから関数境界を呼び出して呼び出したい。出来ますか? コンパイラはこう言っています: "FiguraProba.Prostokatは抽象ではなく、FiguraProba.Czworokatの抽象メソッドpole()をオーバービューしません。"私はエラーを理解していますが、目標を達成するためにエラーを解決する方法はわかりません。抽象クラス、継承、図形でprogrammを実行する最善の方法

外国語でコード変数とクラスを使用して申し訳ありません。 - フィギュア kwadrat - 平方 czworokat - 四角形 prostokat - 長方形 ポール - エリア obwod - 周囲のBOK - FIGURA側ソリューションは、次のようになり

+0

'pole'メソッドを正しくオーバーライドしていません。 'abstract'クラスに引数を定義しないと、それを無視することはできません。あなたのクラスProstokatとKwadratはインスタンスを持つことができるクラスです。したがって、あなたは契約ごとに 'pole'メソッドを実装する必要があります(' extend'使用法)。 –

+0

私の答えはあなたを@PoorGuyに助けますか? –

答えて

1

:ここではすべての単語が何を意味するか説明があり

import java.lang.Math; 

public class FiguraProba 
{ 

    public abstract class Figura { 

    public abstract double pole(); 
    public abstract double obwod(); 
    } 

    public abstract class Czworokat extends Figura { 
    public double obwod(double bok1, double bok2, double bok3, double bok4) 
    { 
     return (bok1+bok2+bok3+bok4); 
    } 

    public abstract double pole(); 
    } 

    public class Kwadrat extends Czworokat { 

    double bok1; 
    public Kwadrat(double bokPodany) 
    { 
     bok1=bokPodany; 
    } 

    // Method without any arguments like the Figura class 
    // When you extend an abstract class, you have to 
    // implement the exact method with the exact number of arguments 
    // Of course you are obligated only if you can create an instance 
    // of that object. The perfect example when you are not obligated to 
    // implement a method is class Czworokat. Czworokat is not 
    // obligated, because you can not create an instance out of it. 
    public double pole() { 
     return bok1*bok1; 
    } 
    } 

    public class Prostokat extends Czworokat { 
    double bok1, bok2; 

    public Prostokat(double bokPodany1, double bokPodany2) 
    { 
     bok1=bokPodany1; 
     bok2=bokPodany2; 
    } 

    // Same logic applies here. 
    // When you extend an abstract class, you have to 
    // implement the exact method with the exact number of arguments 
    // Of course you are obligated only if you can create an instance 
    // of that object. The perfect example when you are not obligated to 
    // implement a method is class Czworokat. Czworokat is not 
    // obligated, because you can not create an instance out of it. 
    public double pole() { 
     return bok1*bok2; 
    } 
    } 

    public static void main(String args[]) 
    { 
    //System.out.println(Math.sin(90*(Math.PI/180))); 
    } 
} 

これは、クラスのプロパティのみを使用し、値の代わりに値を返す場合に必要なものです。 1つと2つの引数を持つ(コード内にあるように)poleメソッドが必要な場合は、抽象的なpoleメソッドを削除する必要があります。そうでない場合は、ZERO引数を使用してそのメソッドを実装する必要があります。

poleを引数なしで実装しないことで契約を破ることはできません。 abstractクラスについてより深く理解する必要がある場合は、公式のJava documentationをご覧ください。

0

抽象クラスからメソッドをオーバーライドする場合は、インターフェイス内でそのように見えるものをexaclyで記述する必要があります。したがって、あなたのメソッドは同じ名前と同じ引数を持つ必要があります。

他の世界では、シグネチャの2極(double bok1)のメソッドがありますが、まだメソッドdobule pole()をオーバーライドする必要があります。

関連する問題