3

別のクラスのメソッドで計算を行い、結果をコンソールに書き込もうとしています。私が今直面している問題は、オブジェクト参照に使用するインスタンスがないということです。他のすべてのメソッドを呼び出すメソッドが含まれているクラスの早い段階でインスタンス化したと思っていましたが、明らかに何かが正しくなく、それを機能させるために何をすべきかわかりません。数学の 2 番目のセクションでも同じエラーが表示されますが、これを修正できれば、2 番目のセクションも簡単に修正できるはずです。

class FruitGarden
{
    private Apple apple;
    private Banana banana;
    static void Main(string[] args)
    {
        FruitGarden fruitGarden = new FruitGarden();
        fruitGarden.EatFruits();
    }
    public void MakeFruits()
    {
        Apple apple = new Apple();
        apple.apple(1.5);
        Banana banana = new Banana();
        banana.banana(3.5);
    }
    public void EatFruits()
    {
        double dblpercent;
        MakeFruits();
        Console.WriteLine("You have an Apple and a Banana in your fruit garden.\n");
        Console.WriteLine("What Percent of the Apple would you like to eat?");
        dblpercent = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("\nWhat Percent of the Banana would you like to eat?");
        dblpercent = Convert.ToDouble(Console.ReadLine());
        Console.Write("You have ");
        apple.Eat(dblpercent);
        Console.Write("% of your apple, and ");
        banana.Eat(dblpercent);
        Console.Write("% of your banana left.");
        Console.ReadLine();
    }
}

参照しようとしているリンゴクラスは次のとおりです。

class Apple : Fruit
{
    public double Radius { get;set;}

    public void apple(double radius)
    {
        Radius = Radius;
    }
}

apple = new Apple();リンゴが必要なインスタンスを作成すると思っていましたが、どうやらそうではありませんか?

4

4 に答える 4

3

メソッド内で、メソッドMakeFruitsにローカルな 2 つの変数を宣言したため、それらにアクセスできません。MakeFruits()EatFruits()

次の点に注意してくださいthis.

public void MakeFruits()
{
    this.apple = new Apple(); // "this." is written to make it clearer. 
    this.apple.apple(1.5);    // let's not skip the steps
    this.banana = new Banana();
    this.banana.banana(3.5);
}

メソッドで果物をローカルに宣言したためMakeFruits()、クラスのプロパティapplebananaままnullです。

別のケースでは、apple()メソッドが半径を適切に登録していませんでした。次のように記述します。

public void SetRadius (double radius)
{
    Radius = radius; // by Alexei
}

いずれにせよ、まだ確信が持てない場合は、Pastebin にある Mauris の短期集中コースのノートを参照してください。

于 2012-11-10T03:20:05.313 に答える
2

使用することで

Apple apple = new Apple();

このバージョンの Apple をメソッドにスコープしましたMakeFruits。したがって、EatFruitsメソッド内では、そのスコープで利用可能なバージョンの apple にアクセスします。これは初期化されていないApple apple. メンバーにアクセスしようとすると、初期化されていないため、エラーが発生します。

ここで私が目にする主な問題は、スコープと、大文字と小文字の使用ミスです。

class Apple : Fruit
{
 public double Radius { get;set;}

 //public void apple(double radius)//Constructors need to share the same case 
                                 //as their parent and inherently have no return value
 public Apple(double radius)
 {
    //Radius = Radius;//This is a self reference
    Radius = radius;//This will reference the local variable to Apple, Radius
 }
}

同じ問題がメインプログラムに表示されます

class FruitGarden
{
 private Apple apple;
 private Banana banana;
 static void Main(string[] args)
 {
    FruitGarden fruitGarden = new FruitGarden();
    fruitGarden.EatFruits();
 }
 public void MakeFruits()
 {
    //Apple apple = new Apple();//You have already declared apple in this scope
    //apple.apple(1.5);//This is redundant, what you most likely want is to have this done in a constructor
    apple = new Apple(1.5);//this accesses the scoped apple, and uses the Apple constructor
    //Banana banana = new Banana();//same scopeing issue as apple
    banana = new Banana();
    banana.banana(3.5);//the banana class was not shown so I will leave this
 }
 public void EatFruits()
 {
    double dblpercent;
    MakeFruits();//now made properly with scope
    Console.WriteLine("You have an Apple and a Banana in your fruit garden.\n");
    Console.WriteLine("What Percent of the Apple would you like to eat?");
    dblpercent = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("\nWhat Percent of the Banana would you like to eat?");
    dblpercent = Convert.ToDouble(Console.ReadLine());
    Console.Write("You have ");
    apple.Eat(dblpercent);//Eat was never shown
    Console.Write("% of your apple, and ");
    banana.Eat(dblpercent);//Eat was never shown
    Console.Write("% of your banana left.");
    Console.ReadLine();
 }
}
于 2012-11-10T03:28:01.367 に答える
0

以下を使用する場合、クラスのコンテキストの違いを知るだけで済みます。

public void MakeFruits()
{
    Apple apple = new Apple();
    apple.apple(1.5);
    Banana banana = new Banana();
    banana.banana(3.5);
}

"apple" と "banana" がローカル変数であることをコンパイラに伝えています。..... メソッド "MakeFruits()" にのみ属する変数です。必要なことは、キーワード "this" とコンパイラは、クラス定義で変数をインスタンス化する必要があることを認識します。

public void MakeFruits()
{
    this.apple = new Apple();
    apple.apple(1.5);
    this.banana = new Banana();
    banana.banana(3.5);
}
于 2012-11-10T04:03:13.667 に答える
0

まず、Appleコンストラクターを修正する必要があります。

class Apple : Fruit
{
    public double Radius { get;set;}

    public Apple(double radius)
    {
        Radius = radius;
    }

}

上記のコードは、オブジェクトを作成する正しい方法を示しています。

次のようなことを検討することをお勧めします。

class Program
{

    private static FruitGarden myGarden;

    static void Main(string[] args)
    {
        //get a new garden

        myGarden = new FruitGarden();
        Console.WriteLine(myGarden.PlantFruit("banana")); 
        //returns "You grew one banana!"
        Console.WriteLine(myGarden.PlantFruit("apple")); 
        //returns "You grew one apple!"
        Console.WriteLine(myGarden.PlantFruit("orange")); 
        //returns "You can't grow that type of fruit!"

        EatFruits();
    }

    static void EatFruits()
    {
        //Now, let's just iterate through our fruit garden and eat all of that 
        //yummy fruit!
        for (int i = 0; i < myGarden.Fruits.Count; i++)
        {
            Fruit myFruitSnack = myGarden.Fruits[i];
            while (myFruitSnack.FruitSize > 0)
            {
                Console.WriteLine(myFruitSnack.TakeBite());
            }
        }

        Console.ReadLine();
    }

}

//We could make this virtual or an interface, but I'll leave that out for now.
public class Fruit
{

    private int fruitSize;

    public int FruitSize
    {
        get
        {
            return this.fruitSize;
        }
    }

    public Fruit(int size)
    {
        this.fruitSize = size;
    }

    //The size of the fruit is an internal property. You can see how 
    //big it is, of course, but you can't magically make a fruit smaller
    //or larger unless you interact with it in a way that is allowable
    //according to the current known laws of the universe and agriculture. 
    //I.E, you can take a bite :)
    public string TakeBite()
    {
        if (this.fruitSize > 0)
        {
            this.fruitSize -= 1; //or any other value you decide to use
        }

        if (this.fruitSize > 0)
        {
            //again, there is so much more you can do here.
            return "You take a bite of the fruit!"; 
        }
        else
        {
            return "You take one more big bite and eat all of the fruit!";
        }

    }

}

public class Apple : Fruit
{
    //Someday, you might want to overload these...
    public Apple(int fruitSize)
        : base(fruitSize)
    {

    }
}

public class Banana : Fruit
{
    //Someday, you might want to overload these...
    public Banana(int fruitSize)
        : base(fruitSize)
    {

    }
}

class FruitGarden
{

    //Public property of FruitGarden that contains all of the fruits it has "grown."
    public List<Fruit> Fruits { get; set; }

    public FruitGarden()
    {
        //Instantiate your list now.
        this.Fruits = new List<Fruit>();
    }

    //There are better ways to do this, but for the sake of your project we're
    //going to do something simple. We'll pass in a string representing the 
    //fruit type.
    public string PlantFruit(string fruitType)
    {
        //We're going to implement a simple factory here. Google 'factory pattern'
        //later and be prepared to spend a lot of time reading over the ideas
        //you're going to run into.
        switch (fruitType.ToLower())
        {
            case "apple":
                this.Fruits.Add(new Apple(10));
                break;
            case "banana":
                this.Fruits.Add(new Banana(5));
                break;
            default:
                return "You can't grow that type of fruit!";
        }

        return "You grew one " + fruitType + "!";
    }

}

ここで、これは単なる例であり、多くの重要な概念について詳しく説明していることに注意してください。ハッピーコーディング!

于 2012-11-10T05:03:31.663 に答える