sealed
sealed (密封):表示一个类不能被继承,不能有子类。
通常被定义为sealed都是有一些固定作用、用来完成某种标准功能的类。比如C#系统定义的String类,Int32类,Math类等。
abstract
abstract 抽象可以修饰类及类的一些成员(方法、属性、索引器)。
抽象类:没有具体对象的概念类,不能被实例化,不能用new来创建实例。必须通过被继承,创建子类实例。因此,抽象类不能用sealed修饰。
同时,抽象类的子类也可以是抽象类。
注意:
- 虽然抽象类不能被实例化,但是**可以有构造函数,**这些构造函数可以被子类的构造函数所调用。
- 抽象类的方法可以不是抽象方法;但有抽象方法的类一定得是抽象类。
- 抽象方法在子类中必须被实现,否则子类仍然是abstract的。
- abstract不能与static、private并列修饰同一个方法。
- 子类在实现一个abstract方法时,必须用override修饰,否则不认为实现了抽象方法,而是重新创建new了一个方法。
例如:卡车、火车、船都属于vehicle。
public abstract class Vehicle
{
public void calcuFee(){};
public abstract void getPrice(){};
public abstract void getDistance(){};
}
public class Truck : Vehicle
{
public override void getPrice(){};
public override void getDistance(){};
}
public class Train : Vehicle
{
public override void getPrice(){};
public override void getDistance(){};
}
public class Boat : Vehicle
{
public override void getPrice(){};
public override void getDistance(){};
}
virtual和override
- virtual可以修饰方法、属性和索引器。 被virtual修饰的成员称为虚成员。
- virtual & override 不能与static、private并列修饰。
virtual与abstract的比较
abstract成员隐含是virtual的,但abstract不能和virtual并列修饰。
父类定义时:
- virtual:必须有定义内容。
- abstract:可以只有声明。
子类调用时:
- virtual:虚方法可以被override。
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
此时,如果没有override,返回的是平均价格,而不是trunk的价格。
public class Vehicle
{
public virtual void getPrice()
{
return averagePrice;
}
}
public class Trunk : Vehicle
{
public override void getPrice()
{
return trunkPrice;
}
}
- abstract:抽象方法必须被override。
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。
此时,如果没有override,会出现编译错误。
public abstract class Vehicle
{
public abstract void getPrice();
}
public class Trunk : Vehicle
{
public override void getPrice()
{
return trunkPrice;
}
}