I know how to do this in Java, but C# is not working right. I'm sure I am missing something obvious. I want to downcast Pet to Dog if the Pet is other than a Dog, as you can see. I think the downcast is right, but maybe it is not.
The problem is that this line Console.WriteLine("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}", Name, Type, Price, Weight, Sound(), AKCRegistration);
it does not allow me to access the getters that I am referring to.
This is my Main class
static void Main(string[] args)
{
Pet[] pets = new Pet[5];
pets[0] = new Dog("King", 55, PET_TYPE.Canine, "akc1000", 1000);
pets[1] = new Dog("Princess", 25, PET_TYPE.Canine, "akc1000", 2000);
pets[2] = new Dog("Spike", 25, PET_TYPE.Canine, "akc1000", 25);
pets[3] = new Cat("Missy", 15, PET_TYPE.Feline, 50);
pets[4] = new Cat("Mr Boogangle", 5, PET_TYPE.Feline, 30);
//for (int i = 0; i < pets.Length; i++)
//{
// Console.WriteLine($"{pets[i]}");
//}
for each (Pet pet in pets)
{
if (pet is Dog)
{
Dog Pet = (Dog) pet;
Console.WriteLine("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}", Name, Type, Price, Weight, Sound(), AKCRegistration);
}
}
This is my Dog class
class Dog: Pet
{
private string aKCregistration;
public Dog(string name, int weight, PET_TYPE type, string AKC, double price) : base(name, weight, type, price)
{
this.aKCRegistration = AKC;
if (aKCRegistration == "")
{
aKCRegistration = "Mutt";
}
}
public int AKCRegistration { get; set; }
public override string Sound()
{
return "Woof, Woof";
}
public override string ToString()
{
return String.Format("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}", Name, Type, Price, Weight, Sound());
}
}
My Pet Class
public enum PET_TYPE
{
Canine, Feline
}
public abstract class Pet
{
internal string name;
internal int weight;
internal PET_TYPE type;
internal double price;
public Pet(string name, int weight, PET_TYPE type, double price)
{
this.name = name;
this.weight = weight;
this.type = type;
this.price = price;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int Weight
{
get { return weight; }
set { weight = value; }
}
public double Price
{
get { return price; }
set { price = value; }
}
public PET_TYPE Type
{
get { return type; }
set { type = value; }
}
public override string ToString()
{
return String.Format("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}", Name, Type, Price, Weight, Sound());
}
public abstract string Sound();
} // end class pet
I included everything except my cat class, let me know if you need to see it.
You are not referencing to them using the instance variable Pet
in this case as you are accessing them from outside the class you need to specify the instance variable on them to tell that you are accessing the state of which object like:
Console.WriteLine("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}",
Pet.Name,
Pet.Type,
Pet.Price,
Pet.Weight,
Pet.Sound(),
Pet.AKCRegistration);
and as you are alreading overriding the ToString
member function in Dog
you can also call it like:
string petString = Pet.ToString();
When you are accessing those within the class Dog
it means you are referring to the current object whichever is calling the ToString
method so it works without specifying any instance explicitly, you can think of it that one like:
Console.WriteLine("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}",
this.Name,
this.Type,
this.Price,
this.Weight,
this.Sound(),
this.AKCRegistration);
but we don't need to explicitly add this
as the compiler takes care of that.