Как получить доступ к геттерам и сеттерам из отдельного класса в основной класс (с понижением в C #) - PullRequest
0 голосов
/ 11 октября 2018

Я знаю, как это сделать на Java, но C # работает неправильно.Я уверен, что упускаю что-то очевидное.Как вы можете видеть, я хочу понизить питомца до пса, если он не является псом.Я думаю, что удручение является правильным, но, возможно, это не так.Проблема в том, что эта строка Console.WriteLine("{0,12}\t {1}\t {2,10:C}\t {3}\t {4}", Name, Type, Price, Weight, Sound(), AKCRegistration); не позволяет мне получить доступ к получателям, о которых я говорю.

Это мой основной класс

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

Это урок моей собаки

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

Урок моего питомца

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  

Я включил все, кроме урока моей кошки, дайте мне знать, еслитебе нужно это увидеть.

1 Ответ

0 голосов
/ 11 октября 2018

Вы не ссылаетесь на них, используя переменную экземпляра Pet в этом случае, так как вы обращаетесь к ним извне класса, вам нужно указать переменную экземпляра для них, чтобы сообщить, что вы обращаетесь к состоянию какого объекта, например:

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

и когда вы перечитываете переопределение функции-члена ToString в Dog, вы также можете вызывать ее следующим образом:

string petString = Pet.ToString();

Когда вы обращаетесь к тем в классе Dog это означает, что вы обращаетесь к текущему объекту, в зависимости от того, что вызывает метод ToString, поэтому он работает без явного указания какого-либо экземпляра, вы можете думать об этом как:

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

, но мы ненеобходимо явно добавить this, так как об этом позаботится компилятор.

...