先来简单说一下他们各自的含义是什么:
- 类(class):
类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、
构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的 状态。
2.结构(struct):
C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可
以 包括数据成员和方法成员。
3.抽象类:
①:抽象类是特殊的类,只是不能被实例化;
②:除此以外,具有类的其他特性;
③:重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
④:另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
4.接口:
接口是引用类型,类似于类,和抽象类的相似之处有三点:
①:不能实例化;
②:包含未实现的方法声明;
③:派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口特性如下:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且
这些成员都被定义为公有的。除此之外,不能包含任何其他成员,
例如:常量、域、构造函数、析构函数、静态成员。
一个类可以直接继承多个接口,但只能直接继承一个类。
5.类与结构的区别:
①:类是引用类型,它在堆(heap)中分配空间,栈中保存的只是引用。
结构是值类型,它在栈(Stack)中分配空间。
②:类对象通常用来传递大数据,而结构对象则用来传递小数据。
③:类可以被继承,而结构则不支持。
④:结构对象不能像类对象一样赋值为null。
⑤:结构不能像类一样定义析构器。
⑥:结构不能像类一样定义为抽象的。
⑦:在结构中不能重写方法,除非是object类型的如下方法:
Equals()
GetHashCode()
GetType()
ToString()
若要让结构具有多态特性,可以让其实现接口。
⑧:在类中定义的事件是线程安全的,而结构则不是。
⑨:结构总是具有一个默认的公共无参构造函数,但却不能像类一样
定义私有的无参构造函数(结构也不能再定义公共的无参构造函数,
这与类不相同)。
⑩:类中的静态构造函数会被调用,而结构却不能。因此在结构中
定义的静态构造函数,虽然可以编译通过,但却没有价值。
11、结构不能像类一样定义volatile字段。volatile字段主要用于并发
,它相当于方法体的lock。
12、可以对结构类型使用sizeof,对类则不行。
13、类的字段会被自动初始化为0/false/null,而结构则不能。
14、在结构中不能直接对字段初始化,而类则可以。
15、结构和类对于System.Object.Equals()方法的体现是不相同的。
6.类与抽象类:
①:都可以被继承 ;
②:抽象类不能被实例化,只是用来继承的。普通类可以实例化 ;
③:抽象方法只有含方法声明而没有方法体且必须包含在抽象类里面 ;
④:子类继承抽象类必须实现抽象类中的抽象方法除非子类也是抽象类
⑤:抽象类中可以包含抽象方法也可以包含实例方法;
7.接口与类的区别:
①:接口类似于类,但接口的成员都没有执行方式,它只是方法、属性、
事件和索引符的组合而已,并且也只能包含这四种成员;类除了这四种
成员之外还可以别的成员(如字段)。
②:不能实例化一个接口,接口只包括成员的签名;而类可以实例化
(abstract类除外)。
③:接口没有构造函数,类有构造函数。
④:接口不能进行运算符的重载,类可以进行运算符重载。
⑤:接口的成员没有任何修饰符,其成员总是公共的,而类的成员则可以
有修饰符(如:虚拟或者静态)。
⑥:派生于接口的类必须实现接口中所有成员的执行方式,而从类派生则不然。
那么为什么还要有接口呢?
主要原因是它是一种有效的契约。
类有一些成员,不考虑把这些成员组合在一起,类只是一个拥有各种
方法、字段和属性的列表,但为了能以某种方式使用类,必须知道类
能执行那些功能,具体的操作就是声明执行一个或多个接口的类,
类执行接口的方式是从接口中派生,再提供这个接口中定义的所有
成员的执行方式。
8.抽象类和接口之间的异同
相同点:
①:都可以被继承
②:都可以有方法的声明
③:都不可以被实例化
④:子类必须实现基类的方法除非子类是抽象类不同点:
①:抽象类属于多继承,接口属于单继承
②:抽象类可以包含实例方法而接口不能
③:接口支持回调抽象类不能
④:子类实现抽象基类方法必须用override关键字而实现接口方法则
不用override关键字
⑤:接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念
⑥:接口可以作用于值类型和引用类型,抽象类只能作用于引用类型
(例如:Struct只能继承接口)
⑦:接口多定义对象的行为,抽象类多定义对象的属性。
⑧:如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类
⑨:接口对应是面向对象编程思想的重要原则:面向接口编程
⑩:抽象类对应则是设计模式的的精髓:面相抽象编程
原文地址:https://blog.51cto.com/14236887/2361890
时间: 2024-10-25 00:41:58