2

私は抽象クラスと仮想メソッドを扱っています。現在、ボタン クリックと結果を表示する 2 つの複数行テキスト ボックスで構成されるウィンドウ フォームがあります。基本クラスには、デフォルトのコンストラクターと、基本が必要とするすべての必要なデータを受け入れるコンストラクターがあります。2 つのクラスがありTreesTomatoesデフォルトのコンストラクターと、すべてのデータが渡されるコンストラクターがあります。textBox1 に item と を表示nameできnumber in stockますprice

ただしTrees、高さという名前の変数と、およびという名前のプラットごとの変数tree_heightのサイズとトマトを呼び出して表示することはできません。エラーには、これらの変数の定義が含まれていません。どうすれば修正できますか?Tomatoestomatoes_perplattomatoes_size

コード

namespace plant_shop
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public abstract class Plants
        {
            public string the_name;
            public double num_stock;
            public double price_peritem;
            public double total_item_value;

            public Plants(string new_name, int new_stock, double new_price)
            {
                the_name = new_name;
                num_stock = new_stock;
                price_peritem = new_price;
            }

            public override string ToString()
            {
                return "";
            }

            public virtual double Get_Value()
            {
                double s = 0;
                return s;
            }


        }

        public class Trees : Plants
        {
            double tree_height;
            public Trees(string new_name, int new_stock, double new_price, double new_height)
                : base(new_name, new_stock, new_price)
            {
                tree_height = new_height;
                total_item_value = num_stock * price_peritem;
            }

            public override string ToString()
            {
                string s = "Tree" + "     " + num_stock + "      " +  the_name + "     " + price_peritem + "    " + tree_height ;
                return s;
            }

            public override double Get_Value()
            {
                total_item_value = num_stock * price_peritem;
                return total_item_value;
            }

        }

        public class Tomatoes : Plants
        {

            string sizeoftomato;
            int tomatoesinpat;

            public Tomatoes(string new_name, int new_stock, double new_price, int tomatoes_perplat, string tomatoes_size)
                : base(new_name, new_stock, new_price)
            {
                tomatoesinpat = tomatoes_perplat;
                sizeoftomato = tomatoes_size;  
                total_item_value = num_stock * price_peritem; 
            }

            public override string ToString()
            {
                string s = "Tomatoes" + "     " + num_stock + "      " + the_name + "     " + price_peritem;
                return s;
            }

            public override double Get_Value()
            {

                total_item_value = num_stock * price_peritem;
                return total_item_value;
            }
        }



        public void Report()
        {

             Trees trees1 = new Trees("Oak", 3, 14.40, 2);
             const string format = "{0,-26} {1,-25} {2,-25} {3,-25}";
             string trees1_result = String.Format(format, "Tree", trees1.the_name, trees1.num_stock, trees1.price_peritem, trees1.tree_height); //not showing `tree_height`            
             textBox1.AppendText(trees1_result + Environment.NewLine);
             textBox2.AppendText(trees1.Get_Value() + Environment.NewLine);            

             Tomatoes tomatoes1 = new Tomatoes("Big Boy", 30, 10, 12, "Large");
             const string format2 = "{0,-26} {1,-25} {2,-25} {3,-25}";
             string tomatoes1_result = String.Format(format2, "Tomatoe", tomatoes1.the_name, tomatoes1.num_stock, tomatoes1.price_peritem, tomatoes1.tomatoes_perplat, tomatoes1.tomatoes_size); //not showing `tomatoes_perplat` or `tomatoes_size`
             textBox1.AppendText(tomatoes1_result + Environment.NewLine);
             textBox2.AppendText(tomatoes1.Get_Value() + Environment.NewLine);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Report();
        }

    }
}
4

3 に答える 3

4

さて、コードをある程度コンパイルしました。より明確になりました...

trees1.tree_heightクラス内でプライベートなのでアクセスできず、Treesクラス内のメソッドからアクセスしようとしていますForm1

クラスtomatos_perplatにそのような変数がないため、メソッドからアクセスすることはできません- がありますが、それもプライベートです。Tomatoestomatoesinpat

同上tomatoes_size- フィールドは と呼ばれsizeoftomato、非公開です。

フィールドを非公開にすることは良い考えです。公開することはお勧めしません。代わりに、プロパティを公開して、クラス間でデータを公開する必要があります。非常に単純なプロパティを実装する簡単な方法として、自動的に実装されたプロパティを使用できます。

ただし、組織に取り組むことを強くお勧めします。

  • すべてにネストされたクラスを使用しないでください。それらは便利な場合もありますが、通常は別のトップレベル クラスを用意することをお勧めします

  • .NET 命名規則を読み、それに従ってください

  • あなたのメソッドが何を達成しようとしているのかを考えてみてください - あなたのGet_Valueメソッドのようなものは現時点では無意味です

  • コンソール アプリケーションを試してみることをお勧めします。GUI ほど「刺激的」ではありませんが、理解したり実験したりするのはずっと簡単です。

于 2012-10-19T19:53:38.160 に答える
1

アクセス修飾子が指定されていないクラス内のフィールドを定義しています。デフォルトでは、これらのフィールドは非公開になります。

これらのフィールドを公開するには、パブリック プロパティを使用する必要があります。自動実装されたプロパティも考慮する必要があります。

于 2012-10-19T19:52:04.097 に答える
1

これで修正されます:

public string sizeoftomato;             
public int tomatoesinpat;

これらのフィールドはデフォルトで非公開です。

フィールドは通常、あなたがしていることには適していないことに注意してください。本当に必要なプロパティ:

public string SizeOfTomato { get; set; }
public int TomatoesInPlant { get; set; }
于 2012-10-19T19:53:34.870 に答える