C#の抽象クラスとインターフェイスの詳細な説明

黄舟
リリース: 2017-09-25 11:15:32
オリジナル
2610 人が閲覧しました

疑問が生じます:

C# で抽象クラスとインターフェイスを使用すると、次のような同様の問題に遭遇することがよくありますが、それらは次のように大まかに要約されます:

(1) 抽象クラスとインターフェイスの本質的な違いと関連性は何ですか? ?

(2) 抽象クラスの使用を選択するのはどのような場合ですか?また、インターフェイスを使用するのが最も適切なのはどのような場合ですか?

(3) プロジェクトの保守性と拡張性を高めるためにプロジェクトで使用するにはどうすればよいですか?究極の両刃の剣の効果を達成するために、これを構造体やクラスと密接に組み合わせるにはどうすればよいでしょうか?

解決策:

これは、私が抽象クラスとインターフェイスを学習するときに遭遇した問題でもあります。私が要約した 3 つの問題から、これが私たちのほとんどのプログラマーが遭遇する問題である可能性があることはわかります。問題の 3 つの段階、

第 1 段階 (基本概念): 質問 1 と同様に、これらの人々はまず、基本概念の障害をクリアする必要があります。まず、抽象クラスとは何か、および抽象クラスとは何かを理解する必要があります。インターフェースは?

それでは、抽象クラスとインターフェイスの違いと接続は何であるか理解できましたか?もちろん、これらの概念は比較的抽象的であり、実際に触ることも見ることもできません。もちろん、何もすることがない場合は、デモを作成することが最も重要です。使用するときは、なぜこの方法で使用する必要があるのか​​をよく考えてください。これにはどのような利点があるのでしょうか?インターフェイスは使用できますか? 使用できない場合、抽象クラスを使用する利点は何ですか?これは私の小さな経験でもあります(笑)。ここまで述べたところで、質問 1 をまとめます。第一に、覚えておくと便利です。第二に、理解を深めるためです。

抽象クラスとインターフェイスの概念: 実際、これらの概念は基本的に教科書やブログにたくさんありますが、先輩方が非常によくまとめていますが、知名度や使いやすさの点で少しわかりにくく、理解するのが難しいかもしれません。陝西省の言葉を加えて翻訳します。

(1) 抽象クラス: 派生クラスが共有基本クラスにアクセスするための一連のパブリック メソッドを提供します。

抽象クラスの特徴は次のとおりです: (1) 抽象クラスには、抽象メソッドとメソッド実装の両方が含まれます。 (3) 抽象クラスの抽象メソッドは、派生クラスで実装するか、派生抽象クラスによって継承する必要があります (抽象派生クラスは基本クラスの抽象メソッドを継承できます)。派生クラスで基本クラスの抽象メソッドを実装するために使用されます。 (4) 抽象クラスは単一継承に属します (これはすべてのクラスの同じ性質に属します。ここで言及しておきます) (5) 抽象クラスはFor IS-A に似たグループの抽象化。

上記の内容がよくわからない場合は、抽象クラスに関する公式 Web サイトのアドレスを示します: https://docs.microsoft.com/en- us/dotnet/csharp/ language-reference/keywords/abstract

(2) インターフェイス: 仮想メソッドのセットを含む抽象型

インターフェイスの特徴は次のとおりです: (1) インターフェイスには次の定義のみが含まれます。仮想メソッド、宣言定義のみ、関数実装なし。(2) インターフェイス クラスにはプロパティ、イベント、インデクサーなどを含めることができます。(3) インターフェイス クラスは複数の継承に属します。インターフェイスのすべてのメソッドを実装する必要があります。

抽象クラスとインターフェイスの違い Contact と同じ点:

: (1) 直接インスタンス化することはできず、継承を通じてのみ実現できます

(2) 抽象クラスです。

の違い:

(1) インターフェースは複数の継承をサポートします。

(2) インターフェースにはメソッド、プロパティ、イベント、インデクサーが含まれます。フィールド; 抽象クラスにはフィールドとメソッドを含めることができます

(3) インターフェイスはコールバックをサポートできますが、抽象クラスはコールバックをサポートしません

(4) インターフェイスは値型と参照型の基本クラスとして使用できますが、抽象クラスは参照型の基本クラスとしてのみ使用できます。

第 2 段階 (使用段階): 質問 2 と同様に、これらの人々は基本をある程度理解していますが、単純なデモを作成しているだけかもしれません。では、抽象クラスを使用する場合はどうすればよいでしょうか?

2 番目の質問を分析した後、私は 3 つの提案をしました:

1 つ目の提案は、基本的な概念は単に概念を暗記するだけではなく、練習してさらに考え、さらに練習してさらに考えて繰り返す必要があるということです。慣れるまで何度か繰り返してください。

2 番目の提案は、この知識を自分のプロジェクトで使用することによってのみ、問題を見つけ、解決し、考えることができるようにすることです。私が使用した抽象クラスとインターフェイス プロジェクトの知識ポイントを要約してまとめます

抽象クラスとインターフェイスをいつ使用するかについては、先人の経験を要約し、参考として次の点を示します。

(1) 設計したコンポーネントが将来的に複数のバージョンを持つ場合、たとえば、最初は SQL サーバー、将来的には mysql を使用してデータベース DB を設計することが一般的です。 Oracle や DB を使用する必要がある場合は、クラスを設計するときに、データベース接続名、バージョン、属性などの共通の属性とメソッドを持つように抽象基本クラス DB を設計します。データベースのタイプ、およびデータベースの共通メソッド: Open()、Close() メソッドなど。 (2) 設計されたコンポーネントが共通の動作もサポートする場合、たとえば、鳥、人間、およびすべての車にサウンドを付けることができ、この時点でインターフェイスを設計し、呼び出される関数の動作を含めて、それをそれぞれの特定のクラスに実装できます

(3) インターフェイスを継承する派生クラスまたはインターフェイスでは、これは問題です。インターフェイスに動作メソッドを追加する必要があり、すべての継承が必要になります。これを実装するには、この時点で派生クラスに新しいインターフェイスを実装して、派生クラスの固有のアクションを実装できます。例:

/// <summary>
/// 实现一个爬行动物的动作接口
/// </summary>
interface IAnimalClimb
{
void Climb();
}
/// <summary>
/// 实现一个会叫的动物的动作接口
/// </summary>
interface ICry
{
void Cry();
}
/// <summary>
/// 实现一个动物抽象类
/// </summary>
public abstract class Animal
{
//动物的名字
public string Name { get; set; }
//动物的颜色
public string Color { get; set; }
//动物抽象类的共有方法
public abstract void Sleep();
public abstract void Breathe();
}
/// <summary>
/// 定义鸟类,通用方法是会飞
/// </summary>
public class Bird : Animal,ICry
{
public override void Sleep()
{
Console.WriteLine("Bird派生类继承了基类的Sleep()方法");
}
public override void Breathe()
{
Console.WriteLine("Bird派生类继承了基类的Breathe()方法");
}
//鸟类可以继承统一的接口动作,例如:叫
public void Cry()
{
Console.WriteLine("Bird派生类继承了接口ICry的叫的方法");
}
}
/// <summary>
/// 定义爬行动物类
/// </summary>
public class Snake : Animal, IAnimalClimb
{
public override void Breathe()
{
Console.WriteLine("Snake派生类继承了基类的Sleep()方法");
}
public override void Sleep()
{
Console.WriteLine("Snake派生类继承了基类的Sleep()方法");
}
//爬行动物可以继承统一的接口动物,例如:爬
public void Climb()
{
Console.WriteLine("Snake派生类继承了接口IAnimalClimb的爬的方法");
}
}
ログイン後にコピー

上記のコード。これは問題を説明するためのものであり、比較的単純です。

3 番目の段階 (最適化段階): 質問 3 と同様に、抽象クラスまたはインターフェイスを作成するときに最初に考慮するのは、それが使用できるかどうかです。多くのクラスやインターフェイスが定義されているため、維持や拡張が困難であるか、クラス間に交差部分がある場合、継承関係を最適化するにはどうすればよいでしょうか。プログラムを保守可能かつ拡張可能にするにはどうすればよいでしょうか?
個人的には次のような側面を持つことをお勧めします: (1) しっかりとした基礎知識と深い基礎スキルを持っている必要があります。
(2) より多くの質問をし、より多くのことを考える心を持っている必要があります。抽象クラスとインターフェイスに関する知識。なぜ抽象クラスを使用せず、インターフェイスを使用するのですか?この場所でインターフェイスを使用することが適切なのはなぜですか?
(3) 上級者がどのようにインターフェイスとクラスを設計するかについて詳しく学ぶ。この分野に関する多くの情報をオンラインで検索できます。
(4) 経験と思考を設計するのは上級者であるため、個人的にはデザイン パターンについて詳しく読むことをお勧めします。

以上がC#の抽象クラスとインターフェイスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!