0

ここに私の基本クラスがあります:

    class Pet
    {
        //class internal variables
        string petName;
        bool gender;  //true = female; false = male
        DateTime dob;
        int goodDogs = 0;
        int goodCats = 0;
        int goodKids = 0;

        //constructors
        public Pet(string pn, bool g, DateTime birth, int d, int c, int k)
        {
            petName = pn;
            gender = g;
            dob = birth;
            goodDogs = d;
            goodCats = c;
            goodKids = k;
        }

        public Pet(string pn, string g, DateTime birth, int d, int c, int k)
        {
            petName = pn;
            if (g.ToLower() == "female")
            {
                gender = true;
            }
            else
            {
                gender = false;
            }
            dob = birth;
            goodDogs = d;
            goodCats = c;
            goodKids = k;
        }

        //Properties
        public string PetName
        {
            get
            {
                return petName;
            }
            set
            {
                petName = value;
            }
        }

        public string Gender
        {
            get
            {
                if (gender == true)
                {
                    return "Female";
                }
                else
                {
                    return "Male";
                }
            }
            set
            {
                if (value.ToLower() == "female")
                {
                    gender = true; 
                }
                else
                {
                   gender = false;
                }
            }
        }

        public DateTime DOB
        {
            get
            {
                return dob;
            }
            set
            {
                dob = value;
            }
        }

        public string GoodWithDogs
        {
            get
            {
                switch (goodDogs)
                {
                    case 1:
                        return "Yes";
                        //break;
                    case 2:
                        return "No";
                        //break;
                    default:
                        return "Unknown";
                        //break;
                }

            }
            set
            {
                goodDogs = int.Parse(value);
            }
        }

        public string GoodWithCats
        {
            get
            {
                switch (goodCats)
                {
                    case 1:
                        return "Yes";
                    //break;
                    case 2:
                        return "No";
                    //break;
                    default:
                        return "Unknown";
                    //break;
                }

            }
            set
            {
                goodCats = int.Parse(value);
            }
        }

        public string GoodWithKids
        {
            get
            {
                switch (goodKids)
                {
                    case 1:
                        return "Yes";
                    //break;
                    case 2:
                        return "No";
                    //break;
                    default:
                        return "Unknown";
                    //break;
                }

            }
            set
            {
                goodKids = int.Parse(value);
            }
        }

       // Methods
        public string GetAge()
        {
            DateTime currentDate = System.DateTime.Now;
            TimeSpan daysPassed = currentDate - dob;
            int ageInDays = daysPassed.Days;
            if (ageInDays < 350)
            {
                return (Math.Round(ageInDays / 30.0)).ToString() + " months";
            }
            else
            {
                return (ageInDays / 365).ToString("N1") + " years" ; 
            }
        }
    }

Here is what I have for my class that is trying to inherit:

public class Cat : Pet
{
    private string breed;
    private bool litterBoxTrained;
    private bool declawed;

    public Cat(string pn, string g, DateTime birth, int d, int c, int k,string b, bool lbt, bool dc) 
    : base ( pn, g, birth, d, c, k)
    {
        breed = b;
        litterBoxTrained = lbt;
        declawed = dc;
    }

    public string Breed
    {
        get
        {
            return breed;
        }
        set
        {
            breed = value;
        }
    }

    public string HouseBroke
    {
        get
        {
            if (litterBoxTrained == true)
            {
                return "Yes";
            }
            else
            {
                return "No";
            }
        }
        set
        {
            if (value.ToLower() == "yes")
            {
                litterBoxTrained = true;
            }
            else
            {
                litterBoxTrained = false;
            }
        }
    }

    public string BasicCommand
    {
        get
        {
            if (declawed == true)
            {
                return "Yes";
            }
            else
            {
                return "No";
            }
        }
        set
        {
            if (value.ToLower() == "yes")
            {
                declawed = true;
            }
            else
            {
                declawed = false;
            }
        }
    }
    public string InfoListing()
    {

        return string.Format("{0,-6}{1:-15}{2,-9}{3,-24}{4:-12}", "CAT", petName, gender, breed, base.GetAge());
    }
}

保護に問題があります。一貫性のないクラス保護エラーと、継承された変数 petName と継承されたメソッド GetAge() にアクセスしようとすると 2 つのエラーが発生します。注意点の 1 つは、基本 (ペット) クラスのコードを変更することは許可されていないということです。

どんなアドバイスも素晴らしいでしょう。ありがとうございました

4

1 に答える 1

2

一貫性のないクラス保護エラーが発生します

これPetは、暗黙的internalに(トップレベルのクラスであると想定して)であるためです。

class Pet

一方:Cat_public

public class Cat : Pet

internalクラスをクラスの基本クラスとして使用することはできませんpublicPet公開するか、Cat内部に公開します。

継承された変数petNameにアクセスしようとした2つのエラー

その上の誤解を招くコメントにもかかわらず、この変数:

 string petName;

これはクラス内のメンバーのデフォルトであるため、プライベートです。Petしたがって、コンパイラは、派生クラス内であっても、外部での使用を禁止する絶対的な権利を持っています。PetName代わりにプロパティを使用する必要があります。

および継承されたメソッドGetAge()

うーん。私が見る限り、それは問題ないはずです。多分私は何かを逃しました-見てみましょう。

編集:いいえ、コードをコンパイルしたので、を使用しても問題はありませんGetAge。しかし、アクセスしようとして問題があります-gender多分それはあなたが考えていたものですか?これはうまくコンパイルされます:

return string.Format("{0,-6}{1:-15}{2,-9}{3,-24}{4:-12}",
                     "CAT", PetName, Gender, breed, base.GetAge());

(でオーバーライドされないため、で資格GetAgeを得る必要があるわけではありません。問題はありません。)baseCatGetAge()

于 2013-03-02T18:11:44.537 に答える