2014-02-23 74 views
1

嗨,大家我試圖使用我的Fish class中的屬性,它實現了一個名爲Catchable的接口,在我的Fisher class中,這是可能的,還是有一部分接口我不理解。因爲我覺得我們被允許在已通過接口實現的,在另一個類的類使用的屬性,但是我一直錯誤說:在實現另一個類中的接口的類中使用屬​​性

Error: cannot find symbol 
    symbol: variable weight 
    location: variable item of type Catchable 

Error: cannot find symbol 
    symbol: variable size 
    location: variable item of type Catchable 

Error: cannot find symbol 
    symbol: variable weight 
    location: variable item of type Catchable . 

任何幫助或建議表示讚賞!

如果需要的話,這是我Catchable接口:

public interface Catchable 
{ 
    public float getWeight(); 
    public boolean isDesirableTo(Fisher f); 
} 

Fish class它實現了Catchable接口

public abstract class Fish implements Catchable 
{ 
    // Any fish below this size must be thrown back into the lake 
    public static int THROW_BACK_SIZE = 18; 
    public static float WEIGHT_LIMIT = 10; 

    protected float weight; 
    protected int size; 

    public Fish(int aSize, float aWeight) 
    { 
     size = aSize; 
     weight = aWeight; 
    } 


    public boolean isDesirableTo(Fisher f) 
    { 
     if(canKeep() && f.numThingsCaught < f.LIMIT && this.weight + f.sumOfWeight < WEIGHT_LIMIT) 
     { 
      return true; 
     } 
     else 
     { 
     return false; 
     } 
    } 

    public abstract boolean canKeep(); 

    public int getSize() { return size; } 
    public float getWeight() { return weight; } 


    public String toString() 
    { 
     return ("A " + size + "cm " + weight + "kg " + this.getClass().getSimpleName()); 
    } 

} 

,最後我Fisher class

import java.util.*; 

public class Fisher  
{ 
    private String name; 
    private Catchable [] thingCaught; 
    public int numThingsCaught; 
    private int keepSize; 
    public float sumOfWeight; 
    public static int LIMIT = 10; 

    public String getName() 
    { 
    return this.name; 
    } 

    public int getNumThingsCaught() 
    { 
    return this.numThingsCaught; 
    } 

    public int getKeepSize() 
    { 
    return this.keepSize; 
    } 


    public Fisher(String n, int k) 
    { 
    name = n; 
    keepSize = k; 
    } 

    public String toString() 
    { 
    return(this.name + " with " + this.numThingsCaught + " fish"); 
    } 
    private ArrayList<Catchable> thingsCaught = new ArrayList<Catchable>(); 


    public void keep(Catchable item) 
    { 
    if(this.numThingsCaught < LIMIT) 
    { 
     thingsCaught.add(item); 
     numThingsCaught++; 
     sumOfWeight += item.weight; 
    } 
    } 

    public boolean likes(Catchable item) 
    { 
    if(item.size >= this.keepSize) 
    { 
     return true; 
    } 

    else 
    { 
     return false; 
    } 
    } 

    public void listThingsCaught() 
    { 
    System.out.println(this.toString()); 

    for(Catchable item : thingsCaught) 
    { 
     System.out.println(item.toString()); 
    } 
    } 

    public void goFishingIn(Lake lake) 
    { 
    Catchable item = lake.catchSomething(); 

    if(likes(item)) 
    { 
     this.keep(item); 
    } 
    else 
    { 
     lake.add(item); 
    } 
    } 

    public void giveAwayFish(Fisher fisher, Lake lake) 
    { 
    for(Catchable item : thingsCaught) 
    { 
     if(fisher.likes(item)) 
     { 
     fisher.keep(item); 
     } 
     else 
     { 
     lake.add(item); 
     } 
     sumOfWeight -= item.weight; 
    } 
    thingsCaught.clear(); 
    this.numThingsCaught = 0; 

    } 

} 
+0

出於好奇,你有C#背景嗎? –

回答

2

的問題是下列行:

  • keep()

    sumOfWeight += item.weight; 
    
  • likes()

    if(item.size >= this.keepSize) 
    
  • giveAwayFish()

    sumOfWeight -= item.weight; 
    

在每種情況下,是itemCatchable類型,並且Catchable沒有sizeweight字段。你所要做的就是調用item.getWeight(),而不是item.weight,並添加getSize()方法Catchable,並調用item.getSize()代替item.size

  • Catchable

    public interface Catchable 
    { 
        public float getWeight(); 
        public int getSize(); 
        public boolean isDesirableTo(Fisher f); 
    } 
    
  • keep()

    sumOfWeight += item.getWeight(); 
    
  • likes()

    if(item.getSize() >= this.keepSize) 
    
  • giveAwayFish()

    sumOfWeight -= item.getWeight(); 
    

您不必修改Fish,因爲它已經實現了getSize()。 你應該真的使用像Eclipse這樣的IDE,因爲它可以實時顯示你的錯誤。

2

不是每個Catchable是一個Fish,因此,例如

public boolean likes(Catchable item) 
{ 
    if(item.size >= this.keepSize) 
... 

會失敗,因爲Catchable沒有size成員(也不能有成員變量,因爲它是一個接口)。 item這裏是Catchable,這不是fish

當您使用接口時,您應該只通過接口中定義的方法(或其擴展的接口)與實例進行交互。

+0

所以你可以將大小屬性移動到Catchable? – user3330114

+0

'Catchable'不能有'size'屬性,但是它可以有一個getter方法'getSize()',您可以在'Fisher'類中使用它來代替'size'。 – trutheality

1

我看到這點你的代碼中:

sumOfWeight += item.weight; 

這裏放慢了一下 - 你不使用類的一個具體實例;你所指的是接口。您會注意到該接口沒有weight的字段,因此編譯失敗。

如果你想堅持使用界面,那麼你需要改變一些東西。

  • 將方法getWeight()添加到您的界面。

    public float getWeight(); 
    
  • Fish類中刪除abstract聲明(這隻會傷害和感到困惑)。

  • 然後,當你想執行求和操作,您可以:

    sumOfWeight += item.getWeight(); 
    
+0

謝謝你的迴應,但是我的界面沒有getWeight()方法嗎? – user3330114

+0

是的,但你沒有使用它。我相信我選擇了這個作爲我能夠看到的最快例子(因爲它確實有定義);你也希望在界面中創建其他方法,這些方法依賴於字段而不是界面中的吸氣劑。 – Makoto

2

在Java中,我們通常稱他們爲 「田」 而不是 「屬性」。

無論如何,有幾個問題。首先,您在Fish中聲明weight(例如)protected。這是正確的做法,但這意味着weight無法在Fish之外訪問。所以,你將不得不從Fish一類的外部做到這一點:

void example (Fish fish) { 
    // System.out.println(fish.weight); // <- not allowed, weight is protected 
    System.out.println(fish.getWeight()); // <- ok, getWeight() is public 
} 

這是擺在首位的Catchable接口提供一個公共的getter像getWeight()(這一點,事實上,接口不能有一點非靜態非最終成員字段)。底層實現是隱藏的 - 實現Catchable的對象可能根本沒有weight字段,並可能根據一些完全不同的規則計算返回值。但這並不重要,因爲您通過getWeight()訪問它。

其次,上述不適用於一般的Catchable反正就算Fish.weightpublic意義; Catchable沒有名爲weight的字段。 Fish呢。因此,如果您通過Catchable類型的參考進行訪問,則無論如何都沒有weight

提供Catchable.getWeight(),但是。該方法存在於所有Catchable類型中。所以你必須使用它來訪問weight。因此,在您Fisher你可以這樣做:

void example (Catchable catchable) { 
    // System.out.println(catchable.weight); // <- not allowed, Catchable has no weight 
    System.out.println(catchable.getWeight()); // <- ok, getWeight() is public and is in Catchable 
} 

我強烈建議通過官方Interfaces and Inheritance教程工作。它可能會讓你熟悉你所提到的一些概念。


補充:

好像你在C#中的背景或有類似的「屬性」的概念,另一種語言 - 在那裏你提供一個getter/setter方法,但語法仍然是指它直接由屬性名稱(例如fish.weight = 3自動調用fish.setWeight(3))。

此構造在Java中不存在。你可以寫getters/setters作爲成員方法,然後你給他們打電話,這就是你所得到的。直接字段訪問時不會自動調用getter/setter。你可以這樣:

class Example { 
    public int field; 
    public void setSomething (int x) { ... } 
    public int getSomething() { ... } 
} 

而這就是你得到的。從這個你可以這樣做:

Example x = ...; 
x.field = ...; 
... = x.field; 
x.setSomething(...); 
... = x.getSomething(); 

但你不能自動做這樣的事情:如果你有一個這樣的語言背景

x.setField(...); 
... = x.getField(); 
x.something = ...; 
... = x.something; 

所以,這可能是你的混亂之源。你需要調整。在Java中你必須明確;該語言由於其含糊不清和冗餘度低而值得注意。

+1

掛一秒鐘。 「魚」是「抽象的」。你不能只做'新魚()'。 – Makoto

+0

@Makoto啊,謝謝,我跳過了。一秒。 –

相關問題