5

抽象クラスと継承の使用についてほとんど単純化した理解を与えてくれて、概念と実装方法を本当に理解できるように助けてくれませんか?完了しようとしているプロジェクトがあり、実装方法に迷っています。私は教授とおしゃべりをしていて、それを理解できないのなら、おそらくコースの準備ができていないと言って、かなり言われました。prerequestiteコースをカバーしましたが、これらの概念を理解するのにまだ苦労しています。

明確にするために、私がこれまでに行ったプロジェクトは以下のとおりです。犬・猫のクラスなどはまだ記入していません。ポインタを教えてください。私は誰かに「答え」を教えてくれるように求めているのではありません。私はこれでどこに行くのか迷っています。私はオンラインコースを受講していますが、彼とのコミュニケーションの取り組みは厄介です。他のすべてのコースで4.0を終えたばかりなので、努力を惜しまないのですが、これらの概念の理解と実際の適用方法に迷っています。

このプロジェクトをさらに進めるためのコメントやヘルプはありますか?

私が実装するものの説明は次のとおりです。

概要:

この演習の目的は、インターフェース、継承、抽象クラス、およびポリモーフィズムの使用法を示すことです。あなたの仕事は、提供されたプログラムシェルを取得し、適切なクラスと対応するクラスメンバー/メソッドを追加して、このプログラムを正しく機能させることです。提供されているコードを変更することはできません。自分で作成したクラスのみを追加できます。プログラムを機能させる方法はたくさんありますが、インターフェース、
継承、抽象クラス、およびポリモーフィズムの使用法を示す手法を使用する必要があります。繰り返しになりますが、明確にするために、提供されたコードに追加することはできますが、変更または削除することはできません。提供されるコードは、追加のコードをほとんど使用せずに機能し、演習の要件を満たします。

割り当てが正常に完了すると、プログラムは実行時に次のステートメントを出力する必要があります。

私の名前はスポットです、私は犬です

私の名前はフェリックスです、私は猫です

要件:

1)DogクラスとCatクラスの派生元である「Animal」と呼ばれる抽象基本クラスが必要です。

2)Animal基本クラスは、インターフェイス'IAnimal'から派生する必要があります。これは、IAnimalから派生する必要がある唯一のクラスです。

3)すべての動物には名前があり、名前は犬や猫に固有の属性ではないため、動物

基本クラスは、名前が格納され、WhatIsMyNameget-propertyが実装される場所である必要があります。

4)動物の基本クラスからのみ派生するDogクラスとCatクラスを作成する必要があります。

5)DogクラスとCatクラスは、WhatAmI get-propertyを実装し、適切な文字列値を返す必要があります。

変更できないコード:

using System;

namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }

    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {
            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}

///////////////////////

私がこれまでに書いたコード:

using System;


namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }


    public class Dog
    {
        public abstract string WhatAmI
        {
            get;
            set;
        }
    }//end public class Dog

    public class Cat
    {
    public abstract string WhatIsMyName  
    {
        get;
        set;
    }
    }//end public class Cat

    public abstract class Animal : IAnimal
    {
    // fields
    protected string Dog;
    protected string Cat;

                  // implement WhatIsMyName 

    //properties
    public abstract String Dog
    {
        get;  
        set;
    }
    public abstract String Cat
    {
        get;
        set;
    }
    public abstract string WhatIsMyName();

    } //end public abstract class Animal


    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {

            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}
4

9 に答える 9

6

編集:

各クラスのコード本体を取り出しました-私の答えを見たい場合は、編集リビジョンを見てください:)

まず、インターフェースを定義します

public interface IAnimal
{
    string WhatAmI { get; }
    string WhatIsMyName { get; }
}

このインターフェイスを実装するクラスは、これらのプロパティを実装する必要があります。インターフェースは契約のようなものです。インターフェイスを実装するクラスは、インターフェイスのメソッド、プロパティイベント、またはインデクサーの実装を提供することに同意します。

次に、抽象的な動物クラスを定義する必要があります

public abstract class Animal : IAnimal
{
    //Removed for Training, See Edit for the code
}

クラスが抽象であるという事実は、そのクラスが他のクラスの基本クラスになることのみを目的としていることを示しています。インターフェイスの両方のプロパティを実装し、動物の名前を格納するためのプライベートフィールドもあります。さらに、WhatAmIプロパティアクセサーを抽象化して、各派生クラスに独自の特定のプロパティアクセサーロジックを実装できるようにしました。また、文字列引数を受け入れて値を_nameプライベートフィールドに割り当てるコンストラクターを定義しました。

Catそれでは、クラスとDogクラスを定義しましょう

public class Dog : Animal
{
    //Removed for Training, See Edit for the code
}

public class Cat : Animal
{
    //Removed for Training, See Edit for the code
}

どちらのクラスも継承しAnimal、それぞれに文字列引数を定義するコンストラクターがあり、その引数をパラメーターとして基本コンストラクターに渡します。さらに、各クラスは、の独自のプロパティアクセサーを実装しWhatAmI、それぞれのタイプの文字列を返します。

残りのコードについて

public class Program
{
    public static void DescribeAnimal(IAnimal animal)
    {
        Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
    }

    static void Main(string[] args)
    {
        Dog mydog = new Dog("Spot");
        Cat mycat = new Cat("Felix");
        DescribeAnimal(mydog);
        DescribeAnimal(mycat);
        Console.ReadKey();
    }
}

静的メソッドは引数としてDescribeAnimalを受け入れ、渡されたのプロパティアクセサーとプロパティアクセサーIAnimalによって返された値を書き出します。WhatIsMyNameWhatAmIIAnimal

と両方をAnimal実装し、から継承するため、任意のオブジェクトまたはオブジェクトをパラメータとしてメソッドに渡すことができます。IAnimalDogCatAnimalCatDogDescribeAnimal

私がこれを明確に説明したことを願っています。誰かが私の言葉の選択を厳しくする必要があると感じたら、コメントしてください、そして私は私の答えを編集させていただきます。

于 2009-03-09T18:17:11.230 に答える
1

正直なところ、宿題の質問であろうとなかろうと、この業界でこれを知らない人が多いことに恐怖を感じます。したがって、私は答えます。

インターフェイスは実装を抽象化し、抽象クラスも同様です。インターフェイスを実装する抽象クラスも作成できるため、「vs」はありません。ですから、彼らが互いに戦争をしているとは思わないでください。

したがって、消費者に実装についてあまり知られたくない場合は、 EITHER を使用できます。インターフェイスは実装がないため、この仕事には少し優れています。消費者が取得した値を押して送信できるボタンを示すだけで、抽象クラスがこれよりも少し多く(またはそれ以上!) . したがって、この点だけを取り入れれば、本当に必要なのはインターフェイスだけです。エルゴ、ポイント2:

インターフェースの 2 つの異なる実装間で共通のコードを共有する場合は、抽象クラスとして使用されます。このシナリオでは、2 つの具体的な実装が両方とも、インターフェイスを実装する抽象クラスから継承されます。

簡単な例は IDataStore です。SavingToATextFile データストアは、IDataStore を実装する単なるクラスです。ただし、MsSqlDataStore と MySqlDataStore は共通のコードを共有します。どちらも、IDataStore を実装する抽象クラス SqlDataStore から継承します。

于 2009-03-09T18:23:15.363 に答える
0

別の提案 - (トピックから少し外れていますが、まだ関連しています)

学習目的で、自動プロパティを避けることをお勧めします。それらを明示的に実装すると、何が起こっているのかを理解するのに役立ちます。

たとえば、次のようにする代わりに:

class SomeClass
{
   public string MyProperty
   {
       get;
       set;
   }
}

これを自分で実装してみてください:

class SomeClass
{
    public string MyProperty
    {
        get
        {
             return "MyValue"; // Probably a private field
        }
        set
        {
             // myField = value; or something like that
        }
}

この特定のケースで役立つので、これについて言及します。自動プロパティを使用しているため、コンパイラは「空白を埋めて」おり、あなたの場合、非常に有用なコンパイラ エラーが発生するのを防いでいると思います。これらの概念がどのように機能するかを理解しようとするとき、自分で作業を行うと、通常は難しくはなく、簡単になります。

于 2009-03-09T18:11:09.683 に答える
0

基本的に、インターフェースは、すべての実装者が提供しなければならない「コントラクト」(つまり、操作/プロパティのセット) を定義します。この場合、IAnimal インターフェイスには WhatAmI および WhatIsMyName プロパティが必要です。抽象クラスは特定の機能を提供する場合がありますが、サブクラスによって実装する必要がある操作もいくつか残されます。

あなたの例の場合、「Name」はすべての動物のプロパティであるため、Animal 基本クラスは WhatIsMyName 機能を提供できます。ただし、特定のサブクラスのみが「タイプ」を認識しているため、「WhatAmI」プロパティを提供することはできません。

あなたが投稿したサンプルコードの問題は、アニマルクラスがそのサブクラスの知識を持っていることです。

于 2009-03-09T17:44:25.630 に答える