How do I get access to getters and setters from a separate class to the main class(with downcasting in C#)

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); 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.

1 answer

  • answered 2018-10-11 19:25 Ehsan Sajjad

    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.