抽象类
抽象类:
在程序中使用关键字abstract
如果说正常类是一个完整类,抽象类实际上是一个不完整的类
抽象类的特点
1.如果类中存在抽象方法,那么该方法不能有实现部分,该方法只能有声名
2.含有抽象方法的类一定是抽象类
3.抽象类不一定含有抽象方法
4.如果子类的父类为抽象类并且含有抽象方法,子类必须重写父类的抽象方法并且实现
5.virtual和abstract 不能使用private修饰符,要使用public
6.virtual不能和abstract放在一起
7.抽象类不能被实例化。
8.抽象类可以包含静态成员
抽象类的作用:父类约束子类行为。
从前有一个类,它有好几个愿望,但是它很穷,它没钱买,机缘巧合之下它有了一个儿子,儿子很有钱,实现了它的愿望
abstract class Poor//抽象类
{
public abstract void fangzi();//定义抽象方法
public abstract void chezi();
}
class Son:Poor//继承抽象类,实现抽象类中的所有抽象方法
{
public override void fangzi(){//重写父类抽象方法 关键字override
Console.WriteLine ("买了房子");
}
public override void chezi(){
Console.WriteLine ("买了车子");
}
虚方法和抽象方法
虚方法和抽象方法都可以供派生类进行重写。
1.虚方法必须有实现部分,并且为派生类提供了重写该方法的选项。
2.抽象方法没有实现部分,并且抽象方法的派生是一种强制性的,继承抽象类必须重写实现抽象方法。这与virtual不同
3.抽象方法只能在抽象类中进行声明,抽象方法必须在派生类重写。含有抽象方法的必然是抽象类,也就是说必须强制声明为abstract, 系统不会自动为我们添加。
4.抽象方法必须在派生类重写,这一点和interface(接口)类似,虚方法不必这样。
虚方法和抽象类的联系:
1.无论是虚方法或者是抽象方法,重写必须用override关键字
接口:接口就是公共契约
接口的关键字:interface
接口和类属于同级关系,都属于C#中的编程单位。
接口也被叫做纯洁的抽象类
接口的特点
1.接口不能包含字段
2.接口内不能有修饰符
3.接口中不能有方法体
4.接口同样不能直接实例化
5.接口里面成员总是公共的
6.接口中可以有属性,但是不能有修饰符
7.接口中可以有索引器/事件申明
8.接口中声明的方法,子类实现的时候虽然也用override关键字,但是记住不属于重写,这里不能把override显示的声明出来。
开发准则:尽量多用接口
能用接口的不用抽象类,能用抽象类不用虚方法
interface IInterface1//接口1
{
void name();//默认的访问修饰符是public
void hello();
}
interface IInterface2//接口2
{
void name();
void hi();
}
class A:IInterface1,IInterface2//A类继承两个接口
{
public void hello()//需要public关键字,不需要加override关键字
{
Console.WriteLine ("hello");
}
public void hi()
{
Console.WriteLine ("hi");
}
void IInterface1.name()//因为两个接口中都有name方法所以需要用 接口名.方法名 来重写接口中的方法,并且不能使用public关键字
{
Console.WriteLine ("接口一的方法");
}
void IInterface2.name()//因为两个接口中都有name方法所以需要用 接口名.方法名 来重写接口中的方法,并且不能使用public关键字
{
Console.WriteLine ("接口二的方法");
}
}
class MainClass
{
public static void Main (string[] args)
{
A a = new A ();
((IInterface1)a).name ();//在调用name方法的时候需要将a对象强制转换成接口
((IInterface2)a).name ();//在调用name方法的时候需要将a对象强制转换成接口
}
}