-3

抽象クラスとインターフェイスに関する多くの記事を読みましたが、インタビューに説明できないたびに、plz が両方のトピックをよりよく理解するのに役立つ理由がわかりません。

抽象クラスについての私の理解は何ですか:-プロジェクトでいくつかの一般的な機能を使用したいクラスの抽象クラス。1)「契約社員」2)正社員の2種類あるように

したがって、両方のクラスで First name 、 Last Name 、 Employee ID 、 Salary 、 Total Hours のような同じフィールドを持つ

したがって、ここでの給与計算は契約と正社員に基づいて異なりますが、残りは同じであるため、同じ機能には抽象クラスが必要です。

インターフェース: - インターフェースは、Contract 内のすべてのメソッドが Inherited Class で実装される必要がある Contract のようなものです。それは必須です。

混乱: しかし、Abstract クラスでは、Abstract クラスでいくつかのメソッド Abstract を宣言すると、継承されたクラスで実装することも必須であると言いますか?

両方でよりよく理解できるように説明してください

前もって感謝します

4

5 に答える 5

3

インターフェイスは単なる契約です。任意の実装型を使用できるパブリック API を定義します。1 つの型で複数のインターフェイスを実装できます。また、インターフェイスはクラスだけでなく構造体でも実装できます。これは、OOP のポリモーフィズムの側面をサポートします。フィールドや任意のタイプの実行可能コードを含めることはできません。

抽象クラス、それらはインターフェースよりも多かれ少なかれです。また、パブリック API を定義することもできますが、その主な目的は、派生型の基本機能を提供することです。それらには、本格的なメソッドとプロパティ、フィールドを含めることができます。多くの場合、機能のある側面の実際の実装を継承者に委譲します。その他の違いは次のとおりです。

  • どのクラスも単一の抽象 (または具象) クラスから派生できます
  • 構造体ではなく、クラスのみが抽象型 (または任意の型) から派生できます

したがって、インターフェイスはコントラクト定義用であり、それらを使用するには、それらを実装する必要があります。抽象クラスは基本的な機能を共有するためのもので、から派生しています。

于 2013-10-27T12:54:22.020 に答える
0
  1. 類似のエンティティ間で実装の詳細を共有する必要がある場合に役立つ抽象クラス。
  2. インターフェイスは、オブジェクトが使用されるコントラクトのみを宣言します。

どちらの方法もポリモーフィズムに使用できます。

于 2013-10-27T12:46:28.843 に答える
0

それらは確かに似ており、両方を使用して多くのことを達成できます。

次のクラスを検討してください。

public abstract class PersonBase
    {
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }

        public PersonBase(string name, DateTime bd)
        {
            this.Name = name;
            this.BirthDate = bd;
        }

        public int CalculateAge()
        {
            return DateTime.Now.Year - BirthDate.Year;
        }

        public abstract string HealthRecord { get; set; }

        public abstract string DisplayData();
    }

    public class TeenagerPerson : PersonBase
    {
        public PersonBase BestFriendForever { get; set; }
        public override string HealthRecord { get; set; }
        public TeenagerPerson(string name, DateTime bd)
            : base(name, bd)
        {
        }

        public override string DisplayData()
        {
            return string.Format("Name:{0}  Age:{1}  Health record:{2}  BFF:{3}", Name, CalculateAge(), HealthRecord, BestFriendForever.Name);
        }
    }

    public class AdultPerson : PersonBase
    {
        public override string HealthRecord { get; set; }
        public AdultPerson(string name, DateTime bd)
            : base(name, bd)
        {
        }

        public override string DisplayData()
        {
            return string.Format("Name:{0}  Age:{1}  Health record:{2}", Name, CalculateAge(), HealthRecord);
        }
    }

このサンプルでは、​​抽象基本クラスを使用していくつかの共通プロパティを提供し、派生クラスも独自のプロパティを宣言できるようにします。このソリューションでは、クラスのコンテンツを外の世界に表示する DisplayData() メソッドを実装するように派生クラスを強制します - もちろん、彼らは喜んでいます。

コードのテスト:

var teenager = new TeenagerPerson("Joanne", new DateTime(2000, 11, 05));
teenager.BestFriendForever = new TeenagerPerson("Julia", new DateTime(2000, 10, 05));
Console.WriteLine(teenager.DisplayData());

var adult = new AdultPerson("Mike", new DateTime(1960, 01, 03));
adult.HealthRecord = "2003 - Heart Bypass";
Console.WriteLine(adult.DisplayData());

次の出力が得られます。

名前:ジョアン 年齢:13歳 健康記録:BFF:ジュリア

名前:マイク 年齢:53歳 健康記録:2003年 - 心臓バイパス

抽象クラスを操作するオプションは無限であり、インターフェイスと同じくらい用途が広いと思います。もちろん、抽象クラスの欠点は、C# には多重継承がないため、継承のワンショットが既に抽象クラスで使用されていることです。

PS: 年齢の計算がうまくいかないことに気付きました。timespan を使用したほうがよいかもしれません。:)

于 2013-10-27T13:06:42.257 に答える
0

それらには同様の特徴があります。私にとって、この 2 つのどちらかを選択することは、「has a/does」と「is a」の区別に関するものです。

OO プログラミングの目的の 1 つは、現実世界で実際のオブジェクトを表現することです。継承 (つまり、抽象クラス) を使用する場合、基本クラスはモデル化するオブジェクトの基本的な型であると言っています。そのため、Employeeクラスはある種のクラスから継承されることが多く、インターフェイスから派生するよりもPerson派生する方が自然です。EmployeePersonIPerson

一方、シリアル化など、クラスに実装したい何らかの動作がある場合は、おそらくそれをインターフェイスとして表現したいと思うでしょう。シリアライゼーションはクラスによって提供される機能ですが、クラスが表現しようとしている実世界のオブジェクトのクラスの本質的な部分ではありません。これは、「横断的関心事」と呼ばれることが多いものの典型的な例です。

そのため、おそらく次のような宣言が表示されます

public class Employee : Person, ISerializable { ... }

基本クラスとインターフェイスが逆に表現されているのを見るよりも。また、複数のインターフェイスを使用できるという事実にもうまく適合します。CLR の世界では、クラスは基本的な基本クラスを 1 つだけ持つことができますが、さまざまな動作をいくつでも表現できます。

于 2013-10-27T12:51:06.060 に答える
0

抽象クラスとインターフェースの主な違いは、抽象クラスではいくつかのロジックを実装できますが、インターフェースでは定義されたコントラクトのみを持つことができ、インターフェース内に実装はできません。すべてのメソッドを抽象として持つ抽象クラスは、インターフェイスと同等です。

于 2013-10-27T12:52:57.497 に答える