2

私は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.csprintJobDescriptionPartTime

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

それは言う

エラー CS1061 'Classification' には 'printAccommodationDescription' の定義が含まれておらず、タイプ 'Classification' の最初の引数を受け入れる拡張メソッド 'printAccommodationDescription' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

この問題を解決するにはどうすればよいですか?

アップデート

実行時にオブジェクトのクラスを変更できるようにする必要があるため、型のオブジェクトを作成しClassification、他のクラスに実装されていないいずれかのメソッドを使用する必要があります

4

2 に答える 2

0

オブジェクトをポリモーフィズムと呼ばれる別のオブジェクトタイプにキャストするとき。これは、メソッドを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";
        }
    }
}
于 2015-11-28T17:20:57.710 に答える