C#.NETの抽象クラスとインタフェースの内部での違いは何ですか

1.指向プログラミングとオブジェクト指向プログラミング・インターフェースは、関係は何ですか

まず、プログラミングおよびオブジェクト指向プログラミングのためのインターフェースが同じレベルではない、オブジェクト指向プログラミングは、独立したプログラミングのアイデアよりもより高度ではなく、オブジェクト指向の思想に取り付けられた、の一部です。それとも、それはオブジェクト指向プログラミングシステムの考え方の本質の一つであること。

2.インターフェースの性質

インターフェイス、上面はいくつかの方法で定義されていない集合体からなるサブジェクトコード、固有の名前を持っている、カテゴリ、または他のインターフェイスが実装されてもよい(又は言う継承されてもよい)されます。これは、次の方法の形態であってもよいです。

インターフェイスインターフェイス名
{
    ボイド方法1()。
    無効方法2(INT PARA1)。
    法3(文字列PARA2、文字列PARA3)を無効に。
}

 

だから、インタフェースの性質は何ですか?または存在インターフェースの意味は、はいものです。私はそれは、次の2つの観点から考えることができると思います:

1)インタフェースは、クラスまたはインタフェースを有していなければならないインタフェースを実装する一連のルールを定義するルールの集合です。「あなたがいる場合は、あなたが......することができなければならない......」それはコンセプト的な性質を反映しています。

 例えば、自然の中で、人々は「あなたが男性であれば、あなたが食べることができなければなりません。」、つまり、食べることができます そして、コンピュータプログラムへのシミュレーションは、そこIPerson(慣例で、「I」冒頭からインターフェース名)インターフェースことと)(食べるというメソッドを持っており、我々は実装されている必要があり、それぞれ「人」クラスが表す提供する必要があります自然界をシミュレートIPersonインターフェース、。このルールを「あなたは男であれば、あなたは、食べることができなければなりません」。

ここから、私はあなたが少しオブジェクト指向のものを見ることができると思います。コアオブジェクト指向の考え方の一つ、クラスに、現実の世界をシミュレートするものの現実の世界にある、プログラム全体の各クラスのインスタンスによって相互に通信し、現実世界の動作条件と一致しているシステム機能を、完了するために、お互いに協力するだけでなく、ために思考の対象の本質。

2)インタフェースは、抽象的で同様のもの、特定のサイズ図です。この概念は相対的なものである「などと同様に」、それが原因で異なる見解と異なる粒径であるので、私は、特定の大きさの点で強調していることに注意してください。

 例えば、私の目には、私が男だった、と豚は、本質的に異なっている、私は私を受け入れることができて、私のクラスメートは、この引数に親切ですが、私は絶対に容認できないと豚似ています。しかし、動物学者の目であれば、私と豚たちは、すべての動物であるため、彼は動物行動の研究であったが、彼は、「人」と「豚」IAnimalにこのインタフェースを達成しているのではないと考えることができ、同じである必要があります私は別途と豚扱いますが、この研究では、「動物」から、より大きな粒子サイズになりますが、彼と私は、ツリーの間に本質的な違いを思うだろう。

蚊、細菌、木、きのこ、あるいはSARSウイルス彼の目にしてバイオは、遺伝することができ、私は豚を区別しませんでした、そしてので、今遺伝学者のために、状況が異なっており、彼は我々がIDを達成していると思いますので、違いはありません、このインタフェースをescendable(注意:.降り遺伝VI)、それは我々は、彼がいない、我々は別に勉強だろう遺伝ですが、すべての生物学的研究と同じになりますものです彼の目やウイルスで、分割材料と非物質のみの遺伝継承されていません。しかし、少なくとも、私は石だと違いがあります。

しかし残念ながら、物事は1日、起こる、地球上の偉大な人物があった、彼は唯物弁証法の傑作、博学後、マルクス、エンゲルスに精通していた、レーニンと呼ばれ、彼は、よく知られているのです定義:客観的現実に反映させることができる、いわゆる材料の意識。この時点で、Iと石、空気のトレースは、携帯電話の信号送信イディオムと電磁界は、レーニンの目で客観ので、我々は現実に反映することができる全て意識して、有意差はなかったです。レーニンはプログラマであれば、彼は言う:「IReflectabe」と「IEの達成しながら、いわゆる問題は、すべてのことです生成された二つのインターフェースクラスのSSEのインスタンスを」。(注:vのESSEを反映nは客観的現実を反映しています。)

おそらく、あなたが無駄に私の上記の例のように感じるでしょう、しかし、これは存在の意味へのインタフェースです。オブジェクト指向の考え方と1つのコアと呼ばれる多型、多型は何ですか?私は、粒度ビュー無差別治療と同様のものの統一された治療のいくつかのレベルで意味します。そして、そうすることをあえて、それがためのインターフェースの存在です。そのような遺伝、彼はすべての生き物がIDに実現されていることを知っていたescendableインタフェースを、鳥の生態場合、降坂(存在しなければならない)、この方法で、彼は研究を統一することができ、個別にすべての生き物を研究し、最終的に排出されていません。

ここではあなたのインターフェイスの性質と役割についての視覚的な印象を与えていないことがあります。だから、後の例では、いくつかのデザインパターンを解決するには、より直感的なインターフェースの含蓄が発生します。

3.まとめ指向プログラミング・インターフェース

だから、プログラミングインターフェイスを何に向いていますか?私の個人的な定義である:システム分析およびアーキテクチャは、レベルとの依存関係を区別するために、各レベルは、だけアップ、インタフェースのセットを定義することによって(すなわち、直接上層にインスタンス化されていない)、その上位層に直接サービスを提供することはありません層は、そのインタフェース機能を公開し、インタフェースは、特定の種類に依存せず、唯一、下層に上層に依存しています。

これの利点は、システムの柔軟性のためのすべての良いの最初のは明らかです。下層限りインターフェイスと定数インタフェース機能、変更せずに上層として、変更する必要がある場合。基礎となるコードは、我々は60Gは、ハード、ハードドライブのSeagate 160GのWDへドライブするのと同じように、上面全体を交換変更されない場合でも、コンピュータが他の場所で変更する必要はありませんが、元のハードドライブ、新しいドライブをプルダウンしますコンピュータの残りの部分は、特にハード依存しないため、ライン上でプラグイン、しかし、唯一のIDEインターフェイスを依存ハードディスク限り、このインタフェースを実装し、アップに交換することができます。ここから、プログラム・インターフェースとインターフェースが現実に非常によく似ているので、私はいつもインタフェース(インタフェース)この言葉は、実際にはかなり似ていると思いました!

インタフェースを使用するもう1つのメリットは、開発者のさまざまなコンポーネントまたはレベルであるため、CPUを作るのを待たずにハードドライブを作るような、並列起動することができ、そのため彼らは、ディスプレイを構築していない限り、一貫性のあるインタフェース、合理的な設計、として並行して開発することができます効率を改善します。

 

この記事への補足:

1.二つの単語「インタフェース」「インタフェース」オブジェクト指向言語で、特に「指向プログラミングインタフェース」について

インターフェース簡単なプログラミング言語の範囲よりも大きくする必要がある「インタフェース」という言葉に「インターフェイスへのプログラミング」の友人を参照してください。私が思ったら、それは理にかなっています。私はここに書きすぎ合理的ではありません。私は「インタフェース」に、オブジェクト指向言語は、C#インターフェースを定義するinterfaceキーワードを使用するなど、特定のコード構造を意味すると思います。「インタフェース」の「指向プログラミング・インターフェースは、」そのクラスのためのより抽象的なレベルから指の観点から、ソフトウェアアーキテクチャであること、およびポリモーフィズムを実現するために、基礎となるコンクリート構造部材を非表示にすると言うことができます。あなたは抽象クラスを定義し、目的が多型を達成することであるならば、この意味では、私はまた、「インターフェース」として知られているこの抽象クラスは、合理的であると思います。しかし、合理的かつ不合理な多型は、抽象クラスで実装しますか?第二に以下に説明します。

要約すると、私は2つの概念を区別し、相互接続された両方の「インタフェース」を考えます。「指向プログラミングインターフェイス」インターフェイスは、特定のコンポーネントのこのアイデア、多型レベルを実装柔軟性を増加させるために使用考え、およびソフトウェアアーキテクチャコンポーネントの保守、および「インターフェース」の具体的な言語でありますコードの実装が意味しています。

抽象クラスとインタフェースに関しては2

我々は、単に特定のコードを見れば、これら二つの概念を簡単にぼやけている、あるいはインタフェースは単一の視点から具体的な機能から、冗長であると考え、多重継承(C#、Java(登録商標))に加えて、抽象クラスは完全にインターフェースを置き換えるようです。しかし、インターフェースの存在は、多重継承を実現することにあるのでしょうか?もちろんそうではありません。私は、抽象クラスとインタフェースの違いだと思う動機を使用します抽象クラスは、コードの再利用のために使用される、界面動機の使用が多型でしただから、あなたはかなり躊躇インターフェースや抽象クラスを使用している場所にある場合、あなたはあなたのモチベーションが考えることができます。

看到有朋友对IPerson这个接口的质疑,我个人的理解是,IPerson这个接口该不该定义,关键看具体应用中是怎么个情况。如果我们的项目中有Women和Man,都继承Person,而且Women和Man绝大多数方法都相同,只有一个方法DoSomethingInWC()不同(例子比较粗俗,各位见谅),那么当然定义一个AbstractPerson抽象类比较合理,因为它可以把其他所有方法都包含进去,子类只定义DoSomethingInWC(),大大减少了重复代码量。

但是,如果我们程序中的Women和Man两个类基本没有共同代码,而且有一个PersonHandle类需要实例化他们,并且不希望知道他们是男是女,而只需把他们当作人看待,并实现多态,那么定义成接口就有必要了。

总而言之,接口与抽象类的区别主要在于使用的动机,而不在于其本身。而一个东西该定义成抽象类还是接口,要根据具体环境的上下文决定。

再者,我认为接口和抽象类的另一个区别在于,抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。(当然,有时也可能存在一般与特殊的关系,但我们使用接口的目的不在这里)如,交通工具定义成抽象类,汽车、飞机、轮船定义成子类,是可以接受的,因为汽车、飞机、轮船都是一种特殊的交通工具。再譬如Icomparable接口,它只是说,实现这个接口的类必须要可以进行比较,这是一条规则。如果Car这个类实现了Icomparable,只是说,我们的Car中有一个方法可以对两个Car的实例进行比较,可能是比哪辆车更贵,也可能比哪辆车更大,这都无所谓,但我们不能说“汽车是一种特殊的可以比较”,这在文法上都不通。

 

C#.NET里面抽象类和接口有什么区别?

接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。

人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.

所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

 

下面接着再说说两者在应用上的区别:
     接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
   而抽象类在代码实现方面发挥作用,可以实现代码的重用

模板方法设计模式是抽象类的一个典型应用

 

最佳答案: 
1抽象类
    (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
    (2) 抽象类不能被实例化
    (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
    (4) 具体派生类必须覆盖基类的抽象方法
    (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。如:

using System;
public abstract class A //抽象类A 

    private int num=0;
    public int Num //抽象类包含属性 
    { 
        get 
        { 
            return num; 
        } 
        set 
        { 
            num = value; 
        }         
    }

    public virtual int getNum() //抽象类包含虚方法 
    { 
        return num; 
    }

    public void setNum(int n) // //抽象类包含普通方法 
    { 
        this.num = n; 
    }

    public abstract void E(); //类A中的抽象方法E     
}

public abstract class B : A //由于类B继承了类A中的抽象方法E,所以类B也变成了抽象类 

    
}
public class C : B 

    public override void E() //重写从类A继承的抽象方法。如果类B自己还定义了抽象方法,也必须重写 
    { 
        //throw new Exception("The method or operation is not implemented."); 
    } 
}

public class Test 

    static void Main() 
    { 
        C c = new C(); 
        c.E(); 
    } 
}


二、接 口
    (1) 接口不能被实例化
    (2) 接口只能包含方法声明
    (3) 接口的成员包括方法、属性、索引器、事件
    (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。如:
public delegate void EventHandler(object sender, Event e);
public interface ITest 

    //int x = 0;
    int A 
    { 
        get; 
        set; 
    }
    void Test();
    event EventHandler Event;    
    int this[int index] 
    { 
        get;
        set; 
    } 
}
    (5) 接口中的所有成员默认为public,因此接口中不能有private修饰符
    (6) 派生类必须实现接口的所有成员
    (7) 一个类可以直接实现多个接口,接口之间用逗号隔开
    (8) 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员

三、抽象类和接口
    相同点:
    (1) 都可以被继承
    (2) 都不能被实例化
    (3) 都可以包含方法声明
    (4) 派生类必须实现未实现的方法
    区 别:
    (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
    (2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
    (3) 接口可以被多重实现,抽象类只能被单一继承
    (4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
    (5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
    (6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法    
    (7) 接口可以用于支持回调,而继承并不具备这个特点
    (8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的 
    (9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

おすすめ

転載: www.cnblogs.com/net-sky/p/11017872.html