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