面向对象基础
类和实例
一切事物皆为对象,准确来说:对象是一个自包含的实体,用一组刻识别的特性和行为来标识。
类是具有相同的属性和功能的对象的抽象的集合。
构造函数:
所有类都有构造函数,如果你没有编码则系统默认生成空的构造方法,若你有定义的构造方法,那么默认的构造方法就是失效。
方法重载:
方法重载提供了创建同名的多个方法的能力,但这些方法需要使用不同的参数类型。
封装
定义:每个对象都包含它能进行的操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。
好处:良好的封装能减少耦合,类内部的实现可以自由的修改,类具有清晰的对外的接口
继承
定义:对象的继承代表一种 “is-a” 的关系 ,如果两个对象A和B,可以描述为B是A,则表明B可以继承A,
继承者还可以理解为是对被继承者的特殊化,因为它除了具备继承者的特性外,还具备自己的有的个性
继承定义了类如何相互关联、共享特性,继承的工作方式:定义父类和子类,或者说基类和派生类,其中子类继承了父类的所有特性,
子类不但继承了父类的所有特性,还可以定义新的特性
1:如果子类继承于父类,那么子类可以继承父类所有非private 的属性和功能 ;
2:子类具有自己独有的属性和功能,即子类可以扩展父类没有的属性和功能
3:子类可以一自己的方式实现父类的功能
子类从它的父类中可以继承的有:方法、属性、事件、索引器、域,但对于构造函数只能调用不能继承,对于调用父类的成员,可以用Base关键字
public Cat (string name) : base(name)
{ }
缺点:父类变子类不得不变,继承会破坏封装,父类实现细节暴露给子类
多态
多态表示不同的对象可以有相同的动作,但是要通过自己的实现代码来执行
注意:
1:子类以父类的身份出现
2:子类在工作时以自己的方式来执行
3:子类以父类的身份出现时,子类特有的属性和方法不能使用
为了让子类的实例完全替换来自父类的类成员,父类必须将该成员申明为虚拟的,即在返回类型前添加 virtual 关键字
通常除了字段不能虚拟外,属性、事件、索引器都能虚拟,虚拟方法可以有自己的方法体
子类将父类的实现用自己的实现替换,需要加Override关键字
抽象类
关键字:abstract
1:抽象类不能实例化
2:抽象方法是必须被子类实现的方法
3:如果类中包含抽象方法,必须申明为抽象类,即使类中包含了一般方法
应考虑让抽象类尽可能拥有更多的共同代码,拥有尽可能少的数据
抽象类代表一个抽象概念,它是一个继承点的起点,在我们设计一个新的抽象类时,一定是用来继承的,所有在一个以继承关系形成的等级结构里,树叶节点应当是具体类,树枝节点均应当是抽象类,通俗来说就是,只要有派生类,那么此类就应当是抽象类
抽象类可以有构造函数,但不允许有公开的构造函数,即使我们申明了一个没有构造函数的抽象类,编译器也会自动给它加上一个默认的受保护的没有参数的构造函数,子类在实例化时(不管是否带参数)
使用:
1、初始化抽象类的成员
2、为继承自它的子类使用
接口
接口就是把隐式公共方法和属性组合起来,以封装特定功能的一个集合,一旦实现了接口,类就可以支持接口所指定的所有属性和成员。
声明接口在语法上和抽象类完全相同,但不允许提供接口中任何成员的执行方式,所以接口不能被实例化,不能有构造函数
实现接口就必须实现接口中的所有方法和属性。
接口不能有任何修饰符
接口可以包含:方法、属性、事件、索引器且被定义成私有的,
接口不能包含:常量、域、构造函数、析构函数、静态成员
析构函数:用户析构类的实例,和构造函数想法
1:不鞥在结构中定义析构函数
2:一个类只能有一个析构函数
3:无法继承或重载析构函数
4:无法调用析构函数,他们是自、自动被调用的。
5:析构函数没有修饰符也没有构造函数
抽象类和接口的区别
1:抽象类可以给出一些成员的实现,接口不能。
2:抽象类中的抽象成员可以被子类部分实现,接口中必须全部实现。
3:一个类只能继承一个抽象类,但是可以继承多个接口。
类是对象的抽象,抽象类是类的抽象,接口是行为的抽象