在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类特征
1、抽象类不能实例化。
2、抽象类可以包含抽象方法和抽象访问器。
3、不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。
4、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
在方法或属性声明中使用 abstract 修饰符以指示此方法或属性不包含实现。
抽象类关键字(abstract)
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。
在类声明中使用 abstract 修饰符以指示类只能是其他类的基类。
抽象方法特点
1、抽象方法是隐式的 virtual 方法。
2、只允许在抽象类中使用抽象方法声明。
3、因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
public abstract void MyMethod();
4、实现由 overriding 方法提供,它是非抽象类的成员。
5、在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
1、在静态属性上使用 abstract 修饰符是错误的。
2、在派生类中,通过包括使用 override 修饰符的属性声明可以重写抽象的继承属性。
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。
public abstract class Father
{
public abstract void f();
}
class ZClass : Father
{
public override void f()
{
Console.WriteLine("重写父类抽象类");
}
}
抽象类与普通类的区别:
1、抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。
2、虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
3、允许(但不要求)抽象类包含抽象成员。
4、抽象类不能被密封。
虚拟方法
使用virtul定义该方法为虚拟方法。
虚拟方法重定义
使用override关键字,将一个虚拟的方法重定义。
这里注意。方法的隐式隐藏,使用new显示隐藏。
隐藏只是子类里面的将父类隐藏,但是,不影响父类的方法。
class FClass
{
public virtual void f()
{
Console.WriteLine("父类虚拟方法1");
}
public virtual void d()
{
Console.WriteLine("父类虚拟方法2");
}
}
class Zl:FClass
{
public override void f()
{
Console.WriteLine("重写父类虚拟类1");
}
}