2013-03-26 36 views
5

Tôi đang gặp sự cố ở đây. Tôi muốn thay đổi setter từ một thuộc tính từ superclass (class cha) trong subclass (child) của tôi tuy nhiên khi tôi overide method này trong subclass của tôi, tôi không thể truy cập các thuộc tính private của tôi từ supperclass. Và vấn đề là họ phải ở riêng tư.Ghi đè lên Setter trong Phân lớp

Siêu lớp (vấn đề: setMinimumVoorraad (int voorraad);)

gói domein;

public abstract class Artikel implements Weegbaar 
{ 
    private String omschrijving; 
    private double prijs; 
    private int aantalInStock; 
    private int minimumVoorraad; 

    public Artikel(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad) 
    { 
     this.setOmschrijving(omschrijving); 
     this.setPrijs(prijs); 
     this.setAantalInStock(aantalInStock); 
     this.setMinimumVoorraad(minimumVoorraad); 
    } 

    @Override 
    public String toString() 
    { 
     String output = String.format(" \n omschrijving: %s \n prijs: %f \n In stock %d (minimumvoorraad = %d) \n", this.omschrijving, this.prijs, this.aantalInStock, this.minimumVoorraad); 
     return output; 
    } 
//----Getters---- 
    public String getOmschrijving() { 
     return omschrijving; 
    } 

    public double getPrijs() { 
     return prijs; 
    } 

    public int getAantalInStock() { 
     return aantalInStock; 
    } 

    public int getMinimumVoorraad() { 
     return minimumVoorraad; 
    } 

//----Setters---- 
    public void setOmschrijving(String omschrijving) { 
     this.omschrijving = omschrijving; 
    } 

    public void setPrijs(double prijs) { 
     this.prijs = prijs; 
    } 

    public void setAantalInStock(int aantalInStock) { 
     this.aantalInStock = aantalInStock; 
    } 

    public void setMinimumVoorraad(int minimumVoorraad) 
    { 
     if(minimumVoorraad < 2) 
      this.minimumVoorraad = 3; 
     else 
      this.minimumVoorraad = minimumVoorraad; 
    } 


} 

Subclass

package domein; 


public class Food extends Artikel 
{ 

    private String houdbaarheidsDatum; 
    private double nettoGewicht; 

    public Food(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad, String houdbaarheidsDatum, double nettoGewicht) 
    { 
     super(omschrijving, prijs, aantalInStock, minimumVoorraad); 
     this.setHoudbaarheidsDatum(houdbaarheidsDatum); 
     this.setNettoGewicht(nettoGewicht); 
    } 

    @Override 
    public boolean isWeegbaar() 
    { 
     return true; 
    } 


//----Getters---- 
    public String getHoudbaarheidsDatum() { 
     return houdbaarheidsDatum; 
    } 

    public double getNettoGewicht() { 
     return nettoGewicht; 
    } 

//----Setters---- 
    public void setHoudbaarheidsDatum(String houdbaarheidsDatum) { 
     this.houdbaarheidsDatum = houdbaarheidsDatum; 
    } 

    public void setNettoGewicht(double nettoGewicht) { 
     this.nettoGewicht = nettoGewicht; 
    } 

    @Override 
    public void setMinimumVoorraad(int minimumVoorraad) 
    { 
     if(minimumVoorraad < 5) 
      this.minimumVoorraad = 6; 
     else 
      this.minimumVoorraad = minimumVoorraad; 
    } 


} 

Một người nào đó có thể giúp tôi? Cảm ơn trước.

+1

Rõ ràng là chúng ta cần xem mã. –

Trả lời

2

Câu trả lời đưa ra ở trên bởi NPE là hoàn toàn cách tốt nhất để đi về việc giải quyết vấn đề này. Nó là thanh lịch và tôn vinh các hợp đồng thừa kế cơ bản giữa superclass và subclass. Thậm chí trong bài viết ban đầu của bạn, các lớp con thực sự là hạn chế hơn lớp cha, làm như vậy một cái gì đó như:

@Override 
public void setMinimumVoorraad(int minimumVoorraad) 
{ 
    if(minimumVoorraad <= 5) 
     super.setMinimumVoorraad(6); 
    else 
     super.setMinimumVoorraad(minimumVoorraad); 
} 

chính xác như NPE gợi ý có lẽ sẽ làm việc. (Lưu ý làm thế nào tôi sửa đổi thử nghiệm if của bạn. Bạn không chắc chắn nếu đó là một lỗi đánh máy, nhưng trong việc thực hiện ban đầu 5 sẽ là một tối thiểu hợp lệ, nhưng đầu vào như 4 sẽ đặt nó vào 6.)

khác (có thể chấp nhận được) mô hình sẽ được gửi đến:

  1. Làm cho các thành viên trong lớp Cha mẹ của bạn protected, có thể hiển thị. (Nhận ra rằng bạn đã đề cập đến giới hạn private; mẫu này chỉ được đề cập để cung cấp câu trả lời tổng thể hoàn chỉnh hơn.)
  2. Ủy quyền logic xác thực cho phương thức khác (không phải là riêng tư). Bằng cách này, trẻ có thể ghi đè lên phương thức xác thực.

Và bây giờ đến (có thể là không thể chấp nhận) mô hình của việc sử dụng Java phản ánh:

@Override 
public void setMinimumVoorraad(int minimumVoorraad) { 

    try { 
     Field field = this.getClass().getSuperclass().getDeclaredField("minimumVoorraad"); 
     field.setAccessible(true); 

     if(minimumVoorraad <= 5) 
      field.set(this, 6); 
     else 
      field.set(this, minimumVoorraad); 

     field.setAccessible(false); 
    } 
    catch(NoSuchFieldException | IllegalAccessException e) { 
     // do something 
    } 
} 

Nó đáng chú ý rằng nếu bạn không bao giờ làm điều này trong toàn bộ cuộc sống của bạn, bạn có lẽ sẽ là tốt hơn cho nó . Không chỉ hoàn toàn phá vỡ tất cả các hợp đồng, nhưng nó dựa trên các chuỗi mã hóa cứng để thực hiện tra cứu tên trường, mà trong và của chính nó là khá đau đớn. Nhưng nó tồn tại. Và không có câu trả lời hay nào (đã đưa ra ở trên bởi NPE) sẽ hoàn thành nếu không có ví dụ về cách không để làm điều gì đó ...

9

Một khả năng là triển khai setter của lớp con về mặt setter của lớp cha (có lẽ, bạn có quyền truy cập).

Ví dụ, giả sử setter là setFoo, sau đó phiên bản của lớp con có thể là:

public void setFoo(Foo f) { 

    // Do subclass stuff pre-setting, if any 

    super.setFoo(f); 

    // Do subclass stuff post-setting, if any 
} 
+0

Ngắn hơn và rõ ràng hơn tôi, +1 –

+0

@ T.J.Crowder: Cảm ơn bạn đã chỉnh sửa. – NPE

+0

Cảm ơn, nhưng tôi muốn loại bỏ các điều kiện đã được xác định trong lớp cha của tôi. – Energyfellow

Các vấn đề liên quan