C#抽象类和虚方法
抽象类与抽象方法:
1.使用关键字abstract修饰的类,称为抽象类.
2.抽象类只是用到一个类所具有的行为,不能单独通过创建对象来使用.使用new是错误的.
3.抽象类中可以有抽象方法,也可以没有任何抽象方法.
4.抽象类不能是静态的(static)或者密封的(sealed)
抽象方法的概念与使用要点:
1.在抽象类中使用abstract修饰的方法,称为抽象方法.
2.抽象方法必须在抽象类中定义,不能再普通类中使用.
3.抽象方法只能是一个方法的申明,不能有任何的方法体.
4.抽象方法仅仅表示一个应该具有的行为,具体实现由子类实现.
5.抽象方法在子类中被实现(重写)必须使用关键字override.
6.子类必须重写父类的所有抽象方法,除非子类本身也是抽象类.
多态:
不同对象,接收相同消息,产生不同的行为,称为多态。
使用继承实现多态:
父类中必须有抽象方法或虚方法.
子类必须重写父类中的抽象方法或虚方法.
子类对象必须转换成父类对象去使用.
LSP:李氏替换原则:
1.子类的对象能够替换其父类.
2.父类对象不能替换子类.
3.父类的方法都要在子类中实现或者重写.
is与as操作符:
is,检查对象是否与指定类型兼容,如果转换失败程序中断.
as 用于在兼容的引用类型之间执行转换,转换失败返回null.
抽象方法仅仅是声明,没有任何实现内容。
抽象方法必须在子类中重写以后才有使用价值.
针对抽象方法问题引出:
如果需要在父类中提供一个方法,该方法有自己的方法体,子类根据自己的需求决定是否重写该方法,而不是必须重写.
父类方法定义成:virtual,子类可以重写也可以不重写.
虚方法如同抽象方法一样,可以实现多态.
子类没有重写虚方法时,直接调用父类的虚方法.
构造方法,用来对象创建过程中初始化。
Equals默认支持的是引用相等,想让对象相同,重写Equals
虚方法和抽象方法
用virtural修饰,要有方法体,哪怕是一个分号,可以被子类override,除了密封类都可以写
用abstract修饰,不允许有方法体,必须被子类override,只能在抽象类中.
关于Equals()虚方法:
对于字符串和值类型能够自动比较是否相等.
对于对象比较必须重写后才有意义.
关于ToString()虚方法:
默认返回该对象的完全限定类型名称,可根据需要重写.
而对于值类型,因为重写的该方法,则返回变量值的字符串表示.