2016-04-03 23 views
-1

3 sınıfım var ve dikdörtgen sınıfımda boy ve genişliğin aynı uzunlukta olup olmadığını kontrol eden bir yöntem var, ancak üçgen sınıfımda yükseklik ve genişlik ayarlıyorum ve üçgen sınıfımı miras alırsam dikdörtgen isSquare() yöntemi, 0.0 ve 0.0 varsayılan değerlerini kullandığından doğrudur. Nasıl oluyor da Üçgen sınıfında atadığım şey miras kalmıyor?Java'da sınıf değişkenleri miras alınıyor?

class inheritence { 
    private double width; 
    private double height; 
    public void setHeight(double height){ 
     this.height=height; 
    } 
    public double getHeight(){ 
     return height; 
    } 
    public void setWidth(double width){ 
     this.width=width; 
    } 
    public double getWidth(){ 
     return width; 
    } 
    void showDim(){ 
     System.out.println("Width and height are "+width+" and "+height); 
    } 
} 

class Triangle extends inheritence{ 
    String style; 
    double area(){ 
     return getHeight()* getWidth(); 
    } 
    void showStyle(){ 
     System.out.println("Triangle is "+style); 
    } 
} 

public class Rectangle extends Triangle{ 
    boolean isSquare(){ 
     if(getWidth()==getHeight()){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    public double area(){ 
     return getWidth()*getHeight(); 
    } 
} 

public class Driver { 
    public static void main(String[]args){ 
     Triangle t1=new Triangle(); 
     Triangle t2=new Triangle(); 
     Rectangle rect=new Rectangle(); 
     t1.setHeight(10); 
     t1.setWidth(20); 
     if(rect.isSquare()){ 
      System.out.println("Its a square!"); 
     }else{ 
      System.out.println("Its not a square"); 
     } 

     System.out.println(t1.getHeight()); 
     System.out.println(t1.getWidth()); 
     t1.showDim(); 
     System.out.println("The area for t1 is "+t1.area()); 
     t1.style="Outlined"; 
     t1.showStyle(); 
    } 
} 
+0

Başlangıçta doğru olmalıdır. Genişlik ve yükseklik özelliklerini değiştirdikten sonra farklı olabilir. Ve bir Dikdörtgen bir Üçgen türü değildir, bu yüzden çok iyi bir sınıflandırma yapısı değildir. – ManoDestra

+4

... Bir dikdörtgen ** kesinlikle bir üçgen değildir, yani miras yapınızın yanlış olduğu (ve şekillerin geleneksel olarak sorunlu olduğu). Ayrıca, bir üçgen alan zaten yanlış olur. –

+0

Lol, Korkunç sınıf yapısının olduğunu biliyorum, ANCAK neden işe yaramadığını merak ediyorum – Eli

cevap

3

Sen Triangle sınıfı (t1) örneğine içinde width ve height ayarı, ancak çeke rect.isSquare() çağrı Hangi anlamına gelir (statik değildir) Eğer width ve height set vermedi kendisi için farklı bir örneği, (olur bir Rectangle olmak), bu yüzden 0.

width ve height üyelerinin örnek üyeleri kalmıştır class inheritence sınıfınızın her bir örneği, onlar için farklı değerlere sahip olur, bu nedenle bunları bir örnekte ayarlamak, diğer durumlarda değerlerini etkilemez.

1

rect nesnesi yerine t1 nesnesinin yüksekliği ve genişliğini ayarlıyorsunuz. Eğer itiraz rect olarak ayarlarsanız değerlerini devralan beri sonra çıkış Its not a square

rect.setHeight(10); 
    rect.setWidth(20); 

gösterecektir, temelde çalışmak için ayrı üçgen nesne örneklerini gerekmez. Basitçe 1 nesne ile çalışabilirsiniz, yani rect

+0

Bu yüzden miras için nesnelerin değerlerini miras almayacak? – Eli

+0

OOP'ların miras ilkesine göre özellikleri miras aldığınızdan, temelde çalışmak için ayrı üçgen nesne örneklerine ('t1' veya' t2') ihtiyacınız yoktur. Basitçe 1 nesnesi ile çalışabilirsiniz, yani '' rect' '' Dikdörtgen '' bir nesne örneğidir, 'Üçgen' ve 'Üçgen' öğelerinin özelliklerini miras alacaktır, miras sınıfından yükseklik ve genişlik miras alacaktır. . –

İlgili konular