簡體   English   中英

傳遞給Setter和Getter方法

[英]Passing to Setter and Getter methods

我有一個面包課程和一個填充課程,分別設置面包的類型和每卡路里的卡路里,以及一個填充課程,其設置每餐的填充類型和卡路里的卡路里...我似乎無法弄清楚如何將它們傳遞到三明治類正確。 我的總卡路里不起作用

    private class Sandwich {
        private Bread bread;
        private Filling filling;
        private Bread caloriesPerSlice;
        private Filling caloriesPerServing;



    private Sandwich(String breadType, int caloriesPerSlice, String fillingType, int caloriesPerServing) {
        setBread(bread);
        setBread(caloriesPerSlice);
        setFilling(caloriesPerServing);
        setFilling(filling);
    }

    public Bread getBread() {
        return bread;
    }

    public void setBread(Bread bread) {
        this.bread = bread;

    }

    public Filling getFilling() {
        return filling;
    }

    public void setFilling(Filling filling) {
        this.filling = filling;

    }

    public int getTotalCalories(int caloriesPerSlice,int caloriesPerServing) {

        (caloriesPerSlice) * 2 + caloriesPerServing =  totalCalories;
        return this.totalCalories;
    }

}

(caloriesPerSlice) * 2 + caloriesPerServing = totalCalories; 不按照您的想法去做。

也許你是說

totalCalories = (caloriesPerSlice) * 2 + caloriesPerServing;

您有向后的變量分配。

(caloriesPerSlice) * 2 + caloriesPerServing = totalCalories; 無效。 分配給的變量必須在左側。

試試: totalCalories = (caloriesPerSlice) * 2 + caloriesPerServing;

該類有很多錯誤:

  • 您有面包卡路里sPerSlice,但構造函數使用與int相同的變量。

  • 與餡裝卡路里每份和整數卡路里每份相同。

  • 它有一個私有的構造函數。 該構造函數指定訪問此類型的類的唯一方法是通過該類中的靜態方法,該方法返回一個Sandwich對象(如單例模式),在此情況並非如此。

  • 該類是私有的:也許我錯了,但是java中的私有類意味着沒有人可以訪問它。

  • 構造函數:例如, BreadType是一個字符串對象,並且不使用。 您正在嘗試使用私有變量setBread ...那是什么?

  • 構造函數:卡路里sperSlice是一個int類型,您可以在用於接收面包類型的setBread()setter中使用它。 您正在混合類型。

  • 與setFilling()中使用的卡路里sPerServing相同,該方法接收一個Filling對象。

  • getTotalCalories:分配在右側而不是左側。

我認為您對OO有誤解。 例如,讓我們看看Bread類:

如果面包類具有卡路里卡路里和面包類型屬性, 它們可能是面包類型的一部分。 讓我們更改類以反映這些屬性:

    public class Bread {
      private int caloriesPerSlice;
      private String type;

      public Bread(String type, int caloriesPerSlice)
      {
        this.type = type;
        this.caloriesPerSlice = caloriesPerSlice;
      }

      public int getCaloriesPerSlice()
      {
        return this.caloriesPerSlice;
      }

      public String getType()
      {
        return this.type;
      }
    }

在這種情況下,面包是通過其構造函數完全定義的。 您可以看到該類沒有設置器。 那是因為我決定了,但是要在類中使用無參數的構造函數和設置方法由您決定。 在這種情況下,我只定義了吸氣劑。 讓我們看一下Filling類:

    public class Filling {
      private int caloriesPerServing;
      private String type;

      public Filling(String type, int caloriesPerServing) {
        this.caloriesPerServing = caloriesPerServing;
      }

      public int getCaloriesPerServing()
      {
        return hits.caloriesPerServing;
      }

      public void setCaloriesPerServing(int calories)
      {
        this.caloriesPerServing = calories;
      }

      public String getType()
      {
        return this.type;
      }

      public void setType(String type)
      {
        this.type = type;
      }
    }

這里的Filling類具有getter和setter。 只是出於解釋的目的:在Filling類中,您可以通過構造函數或通過setter來設置屬性,而在Bread中,只能通過構造函數來定義屬性。

現在,三明治可以接收定義面包和餡料的所有屬性(例如您的情況),或者可以接收面包和餡料的屬性。 讓我們來看看第一種情況:

    public class Sandwich {
        private Bread bread;
        private Filling filling;

        public Sandwich(String breadType, int caloriesPerSlice, String fillingType, int caloriesPerServing) {
            this.bread = new Bread(breadType, caloriesPerSlice);
            this.filling = new Filling(fillingType, caloriesPerServing);
        }

        public Bread getBread() {
            return bread;
        }

        public void setBread(Bread bread) {
            this.bread = bread;

        }

        public int getTotalCalories() {
            return this.bread.getCaloriesPerSlice() * 2 + this.filling.getCaloriesPerServing();
        }
    }

如您所見,我們在Sandwich構造函數中收到了所有定義面包和餡料的參數。 然后,我們通過傳遞其參數創建了Bread和Filling對象。 最后,getTotalCalories只是面包和填充屬性的簡單數學運算。

這段代碼只是在文本編輯器中編寫的。 我沒有檢查是否可以。

在此示例中,Sandwich成為一個類和一個工廠,這是該類的一個非常重要的組成部分。 如您所見,“面包”和“餡料”類的構建是通過“三明治”完成的。 三明治控制對象的創建是有好處的,但事實是: 三明治是否對此負責? 也許不是,因為當您在家里做一個三明治時,您會得到面包和其他配料,然后將它們放在切片上……三明治不負責制作面包切片……它不會使面包切片在現實生活中的感覺。 然后,最好在Sandwich構造函數中刪除對象創建:

        public Sandwich(Bread bread, Filling filling) {
            this.bread = bread;
            this.filling = filling
        }

這種情況更“正確”,因為您要用內存中已經生成的元素做一個三明治。 當您在家中做三明治時,情況是一樣的:先拿面包,餡料再做三明治。

我希望這可以澄清一些有關OO的知識。

問候!

我在您的代碼中看到了一些問題:

  • 為什么Sandwich實例必須在其中包含兩個Bread對象? 三明治通常由一種面包制成。
  • caloriesPerSlicecaloriesPerServing應該分別是BreadFilling屬性。
  • 您不能將String參數傳遞給setFilling(Filling filling)方法。
  • (caloriesPerSlice) * 2 + caloriesPerServing不是有效的左值,也不是有效的表達式,因為caloriesPerSlicecaloriesPerServing是對象。

這是您想法的一個非常基本的實現:

面包.java

public class Bread
{
    private String type;
    private int caloriesPerSlice;

    public Bread(String type, int caloriesPerSlice)
    {
        this.type = type;
        this.caloriesPerSlice = caloriesPerSlice;
    }

    public String getType() { return type;}

    public int getCaloriesPerSlice() { return caloriesPerSlice; }

    public String toString()
    {
        return type + " (" + caloriesPerSlice + "cal)";
    }
}

Filling.java

public class Filling
{
    private String name;
    private int caloriesPerServing;

    public Filling(String name, int caloriesPerSlice)
    {
        this.name = name;
        this.caloriesPerServing = caloriesPerSlice;
    }

    public String getName() { return name;}

    public int getCaloriesPerServing() { return caloriesPerServing; }

    public String toString()
    {
        return name + " (" + caloriesPerServing + "cal)";
    }
}

Sandwich.java

public class Sandwich
{
    private Bread bread;
    private Filling filling;

    public Sandwich(Bread bread, Filling filling)
    {
        this.bread = bread;
        this.filling = filling;
    }

    public int getTotalCalories()
    {
        return 2 * bread.getCaloriesPerSlice() + filling.getCaloriesPerServing();
    }

    public String toString()
    {
        return "Bread: " + bread.toString() + "\nFilling: " + filling.toString();
    }
}

Main.java

public class Main
{
    public static void main(String args[])
    {
        Bread bread = new Bread("Baguette", 150);
        System.out.println("I would like a " + bread.toString());

        Filling filling = new Filling("Prosciutto di Parma", 75);
        System.out.println("with " + filling.toString());

        Sandwich sandwich = new Sandwich(bread, filling);
        System.out.println("Your order is:");
        System.out.println(sandwich.toString());

        int totalCalories = sandwich.getTotalCalories();
        System.out.println("The total calories are " + totalCalories);
    }
}

這是輸出:

I would like a Baguette (150cal)
with Prosciutto di Parma (75cal)
Your order is:
Bread: Baguette (150cal)
Filling: Prosciutto di Parma (75cal)
The total calories are 375

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM