C# Не удается получить доступ к дочернему общедоступному методу из абстрактного родительского объекта класса

Я изучаю OOAD и пытаюсь реализовать классовые отношения с наследованием, но здесь есть проблема, это код

Родительский класс

namespace ConsoleApplication1
{
    abstract class Classification
    {
        public abstract string type();
    }
}

1-й детский класс

namespace ConsoleApplication1
{
    class FullTime : Classification
    {
        bool inCampus;
        string roomDetail;
        float rent;

        public FullTime(string studentRoomDetail, float studentRent)
        {
            this.inCampus = true;
            this.roomDetail = studentRoomDetail;
            this.rent = studentRent;
        }

        public FullTime()
        {
            this.inCampus = false;
        }

        public string printAccommodationDescription()
        {
            if (!this.inCampus)
            {
                return "Not in campus";
            }
            else
            {
                return "Room: " + this.roomDetail + " Rent: " + this.rent.ToString();
            }
        }

        public override string type()
        {
            return "fulltime";
        }
    }
}

2-й детский класс

namespace ConsoleApplication1
{
    class PartTime : Classification
    {
        bool onJob;
        string jobTitle;
        float salary;

        public PartTime(string studentJobTitle, float studentSalary)
        {
            this.onJob = true;
            this.jobTitle = studentJobTitle;
            this.salary = studentSalary;

        }

        public PartTime()
        {
            this.onJob = false;
        }

        public string printJobDescription()
        {
            if (!this.onJob)
            {
                return "Not on job";
            }
            else
            {
                return "JobTitle: " + this.jobTitle + " Salary: " + this.salary.ToString();
            }
        }

        public override string type()
        {
            return "parttime";
        }
    }
}

Теперь в Program.cs, когда я пытался получить доступ к методу printJobDescription от PartTime учебный класс

Classification classification = new PartTime("Software Engineer", 10000);
classification.printJobDescription();

это говорит

Ошибка CS1061 "Классификация" не содержит определения для "printAccommodationDescription", и метод расширения "printAccommodationDescription", принимающий первый аргумент типа "Классификация", не найден (отсутствует директива using или ссылка на сборку?)

Как я могу решить эту проблему?

ОБНОВИТЬ

Мне нужна возможность позволить объекту изменять свой класс во время выполнения, поэтому мне нужно создать объект типа Classification и использовать любой метод, который не реализован в другом классе

2 ответа

Решение

Вы можете использовать только функции, объявленные в используемом вами классе.

abstract class Classification
{
  public abstract string type();
}

class PartTime : Classification
{
  public override string type() {...}
  public Job1() {...}
}

class FullTime : Classification
{
  public override string type() {...}
  public Job2() {...}
}
  • Объект типа Classification может использовать только тип ()
  • Объект типа PartTime может использовать type и Job1()
  • Объект типа FullTime может использовать type и Job2()

Если у вас есть такой объект:

Classification classification = new PartTime();

и вы не знаете, какой специальный тип, вы должны привести этот объект, чтобы использовать другие методы:

if (classification is PartTime)
{
  ((PartTime)classification).Job1();
}
else if (classification is FullTime)
{
  ((FullTime)classification).Job2();
}

Надеюсь это поможет.

При приведении объекта к другому типу объекта, который называется Полиморфизм. Это означает, что вы можете использовать только те методы и свойства, которые доступны для целевого типа объекта, который Classification который не знает ваш метод.

Простой пример, который я сделал:

using System;

namespace Program
{
    public class Program
    {
        public static void Main()
        {
            Dog rex = new Dog();
            Animal rexAsAnimal = rex;

            // Can access 'MakeSound' due the fact it declared at Dog (Inherited by Animal)
            Console.WriteLine(rex.MakeSound()); // Output: Bark

            // Compilation error: rexAsAnimal is defined as 'Animal' which doesn't have the 'Bark' method.
            //Console.WriteLine(rexAsAnimal.Bark()); // Output when uncomment: Compilation error.

            // Explicitly telling the compiler to cast the object into "Dog"
            Console.WriteLine(((Dog)rexAsAnimal).Bark()); // Output: Bark
        }
    }

    public abstract class Animal
    {
        public abstract string MakeSound();
    }

    public class Dog : Animal
    {
        public override string MakeSound() { return Bark(); }
        public string Bark()
        {
            return "Bark";
        }
    }
}
Другие вопросы по тегам