抽象类方法
1.抽象方法用abstract修饰。
2.抽象方法不能有方法体,大括弧也不能有。
3.抽象方法必要再抽象类中。abstract class
4.抽象方法不能实例化,因为有抽象成员,而抽象成员是没有方法体的。
5.子类要实现,子类必须重写父类的抽象方法。(与virtual最大的不同)
6.在子类中无法通过base关键字,调用父类的抽象方法。
7.抽象方法是光说不做,只是定义了具有这样的行为,但是具体的实现交给子类。
8.抽象类中可以拥有非抽象成员,为了继承给他的子类。
9.抽象类中可以拥有虚方法。
10.子类必须重写父类的方法,父类没有必要实例化,就用抽象类
11.抽象类被继承,是为了多态。
12.抽象成员不能是私有的,因为子类没办法访问,就没办法重写。
案例:手机储存设备。
ToString()与Equal()
书写一个类,其实书写这个类的ToString()方法。书写是类名(p.GetType().ToString());
1. object类里面的equals方法是比较两个对象的引用地址,如果引用地址都一样,则返回True;
2. 引用类型(类)的Equals方法默认比较是两个对象的地址,如果要改变规则,则子类重写;
3. string 值类型 Equals方法比较的两个结构对象里字段的值(这时候不存在重写,只是值类型自己新增1方法);
接口
IRunable(接口命名) I**able
interface定义1个接口;接口表示具有某种能力。(接口其实就是规范,而不是物理存在的东西)
1.接口是1个特殊的的抽象类。(里面所有方法默认都是抽象的,因此不能有访问修饰符,默认就是public)
2.接口不能实例化。(不能new)
3.接口内只能定义属性、方法、索引器、事件。
4.实现接口的类,必须要实现接口中的所有的成员。
5.实现类在实现接口的成员的时候,不要写override关键字
6.实现成员的时候,必须要保证签名的一致。
7.接口就是一个纯粹的为了规范实现类的。
8.string Name{get; set;} 这里不是自动属性,是个普通属性,只不过get、set方法没有实现
何时使用接口?
多个类具有相同的行为,但是没有共同的父类,就是使用接口。
接口与抽象类的区别?
抽象类:可以找到父类,并且可以通过父类继承给子类一些成员。
接口:找不到父类,并且解决单根性的问题。可以拥有多个接口。
1个类只能继承一个父类,但是可以实现多个接口。父类要写在第一个位置,一定程度上解决了类的单根性的问题。
接口也可以继承接口,并且可以多继承。
接口中的成员可以实现为抽象方法或者虚方法,让实现类的子类去实现。
abstract Person : ISingleable
{
public abstract void Single();
}
interface ISingleable
{
void Single();
}
显示实现接口
class Animal:ISingleable
{
public void Sing()
{
}
void ISingleable.Sing()
{
}
}
显示实现接口是为了解决方法名冲突的问题,显示实现的接口的方法是私有的,所以不能通过对象的变量来调用。
但是我们可以通过接口对象来调用。
使用接口的建立:
面向对象编程,使用抽象(父类,抽象类,接口)不使用具体。
“向上转型”
在编程时,
1.接口->抽象类->父类->具体类
2.能使用接口就不使用抽象类,能使用抽象类就不是父类,能使用父类就不用子类。
3.避免定义“体积庞大的接口”、“多功能接口”、会造成“接口污染”。单一指着原则。
4.定义多个职责单一的接口(组合使用)。
以上要求,还是为了多态。
装箱拆箱的问题
啥叫装箱(box)?将值类型转换成引用类型。(将栈里的值放入堆中)
int i = 12;
object obj = j;
啥叫拆箱()?将引用类型转换为值类型。(将堆的值强行放入栈中)
i = (int) obj;
装箱与拆箱是比较消耗性能的,要尽量去避免,在我们的程序中发生这样的行为。