Reputation:
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
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
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
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