user1434156
user1434156

Reputation:

Abstract classes and virtual methods: cannot access certain variables

I am working with abstract classes and virtual methods. Currently I have a window form composed of a button click and two multiline textboxes where I am displaying the results. The base class has a default constructor and a constructor that accepts all the necessary data the base needs. There are two classes Trees and Tomatoes that have a default constructor and a constructor that is passed all the data. I am able to display in textBox1 the item name, number in stock and price.

However I am not able to call and display for Trees the height variable named tree_height and the Tomatoes size and tomatoes per plat variables named tomatoes_perplat and tomatoes_size. It gives me the error does not contain a definition for those variables. How can I fix that?

CODE

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();
        }

    }
}

Upvotes: 1

Views: 457

Answers (3)

Jon Skeet
Jon Skeet

Reputation: 1501926

Okay, now I've got the code somewhat compiling, it's clearer...

You can't access trees1.tree_height because it's private within the Trees class, and you're trying to access it from a method in the Form1 class.

You can't access tomatos_perplat from the method because there's no such variable in the Tomatoes class - there's tomatoesinpat, but that's private too.

Ditto tomatoes_size - the field is called sizeoftomato, and is private.

Keeping your fields private is a good idea - I don't recommend making them public. Instead, you should expose properties to expose data between classes. You can use automatically implemented properties as an easy way to implement very simple properties.

I'd strongly encourage you to work on your organization though:

  • Don't use nested classes for everything; they're handy occasionally, but it's usually better to have separate top-level classes

  • Read the .NET naming conventions and follow them

  • Think about what your methods are trying to achieve - things like your Get_Value method are pointless at the moment

  • I would urge you to experiment with console applications. They're less "exciting" than GUIs, but are much simpler to understand and experiment with.

Upvotes: 2

user27414
user27414

Reputation:

This will fix it:

public string sizeoftomato;             
public int tomatoesinpat;

These fields are private by default.

Note that fields are not usually appropriate for what you're doing. You really want properties:

public string SizeOfTomato { get; set; }
public int TomatoesInPlant { get; set; }

Upvotes: 1

devdigital
devdigital

Reputation: 34359

You are defining fields within your classes that have no access modifier specified. By default, these fields will be private.

You should use public properties to expose these fields. You should also consider auto-implemented properties.

Upvotes: 1

Related Questions