abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类智能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
抽象类的特性:
抽象类不能实例化。
抽象类可以包括抽象方法和抽象访问器。
不能用sealed修饰符修改抽象类,这也意味着不能被继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
抽象方法:
抽象方法是隐式的虚方法。
只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({}),实现由一个重写方法提供,此重写方法是非抽象类的成员。
在抽象方法声明中使用static或virtual修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为和抽象方法一样。
在静态属性上使用abstract 修饰符是错误的。
在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象继承属性。
抽象类的构造函数:
任何情况下,抽象类都不应该进行实例化,因为,正确定义其构造函数就非常重要。确保抽象类功能的正确性和扩展性也很重要。下列准则有助于确保抽象类能够正确地设计并在实现后可以按预期方式工作。
不要再抽象类型中第一公共的或受保护的内部构造函数,具有public或protected internal 可见性的构造函数用于能进行实例化的类型。任何情况下抽象类型都不能实例化。
应在抽象类中顶一个受保护(protected)构造函数或内部(private)构造函数。
如果在抽象类中定义一个受保护构造函数,则在创建派生类的实例时,基类可执行初始化任务。
把虚方法---抽象类:
虚方法是一个特殊的抽象类。
什么时候用虚方法,什么时候用抽象类。
当所有子类都要实现一些相同功能时,我们可以使用base来调用。用虚方法。
当所有子类所实现的功能都不相同时,用抽象类来实现。
using System;
abstract class Employee
{
protected string _name;
protected Employee() U
protected Employee (string name)
(
_name = name;
)
public abstract void Startwork();
}
class Manager : Employee
{
public Manager (string name) :base(neme) ()
public override void StartWork()
{
Console.WriteLine(_name+"给员工下达任务")
}
}
class Secretary: Employee
(
public Secretary(string name) :base(name) {}
public override void StartWork()
(
Console.WriteLine(_name+"协助经理")
)
)
class Seller: Employee
{
public Seller(string neie) :base(nanie) ()
public override void StartWork()
Console.WriteLine(_name+"销售产品");
class Accountant: Employee
(
public Accountant (string name) :hase(nanie) (I
public override void StartWork()
(
Console.WriteLine (_name+"管理公司财政");
)
}
计算机生成了可选文字:
早上8点,开始工作
张三给员工下达任务
李四协助经理
王五销售产品
马六销售产品
钱七管理公司财政
抽象方法和虚方法的区别:
抽象方法和虚拟方法的区别在于:虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类)
abstract方法只能在抽象类中声明,虚方法则不是。
abstract方法必须在派生类中重写,而virtual则不必。
abstract方法不能声明方法实体,虚方法则可以。
这次文字比较多,多看看多想想每句话的意思,理解理解这些话都指的是什么。
上面那个代码里面那那个构造函数protected Employee (string name){}
这个难道不用在子类中重写?