c#中的类是最常见的实际上就是对某种类型的对象定义变量和方法的原型。
一、值类型与引用类型
结构是值类型,值类型是在堆栈上分配地址,所有的基类型其实都是结构类型,例如int对应System.int32结构。
类是引用类型,引用类型是在堆上分配地址。
结构使用Struct关键字定义,类使用class关键字来定义。
二、继承性
结构不能从另一个结构或者类继承,本身也不能被继承,而类可以继承其他类和接口,自身也能被继承。
虽然结构不能被继承,但是结构能够继承接口,和方法、类继承接口一样。
三、抽象类
类是对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类。抽象类是一种特殊的类,也就是说:不能初始化的类被叫做抽象类,只提供部分实现,但是另一个类可以继承它并且能创建它们的实例,有未被实现的方法。抽象类不能使用new关键字去实例化。抽象类是通过abstract关键字进行定义。
抽象类同样只能通过接口和作为其它类的基类使用。接下来写一个简单的抽象类:
//定义一个抽象的类,并定义一个抽象方法和一个普通方法
public abstract class A
{
//普通方法
public void A1()
{
Console.Write("请选择一种工作");
}
//抽象方法
public abstract void A2();
}
//定义一个类实现抽象类中的抽象方法
public class B : A
{
public override void B()
{
Console.WriteLine("编程");
}
}
四、接口
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1. 不能实例化;
2. 包含未实现的方法声明;
3. 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
注意:接口是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。接口在定义时,通常会在命名前添加I以区别于其他类(例如:IWorker接口);它定义了所有类要继承接口是所以要遵守的一些规范。接口只包含了成员的声明。成员的定义是派生类的责任。接下来实现一个简单的接口:
class Program
{
static void Main(string[] args)
{
IWorker A1 = new A();
IWorker B1 = new B();
A1.work("看电影");
B2.work("打游戏");
}
}
//定义一个接口类
public interface IWorker
{
void work(string x);
}
A类继承接口
class A : IWorker
{
public void work(string x)
{
Console.WriteLine("我的名字是张三,我的爱好是" + x);
}
}
B类继承接口
class B : IWorker
{
public void work(string x)
{
Console.WriteLine("我的名字是李四,我的爱好是" + x);
}
}
五、接口和抽象类的区别
1、接口中只能声明方法,属性,事件,索引器。而在抽象类中可以有方法的实现,也可以定义非静态的类变量。
2、抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性。抽象类是类,所以只能被单继承,但是接口却可以一次继承多个。
3、抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中。
4、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。
5、抽象类不能被密封。
6、接口可以用于支持回调,而继承并不具备这个特点。
7、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
8、我们在VS中实现接口时会发现有2个选项,一个是实现接口,一个是显示实现接口。实现接口就是我们平常理解的实现接口,而显示实现接口的话,实现的方法是属于接口的,而不是属于实现类的。
继承 | |
类 | 全部复用 |
虚类 | 可选复用 |
抽象类 | 部分复用,部分必须重写 |
接口 | 全部重写 |