sealed和JAVA语言中的final一样,可以用来修饰类,实例方法,属性。
密封类不能被继承,密封方法重写基类方法,但不能被任何派生类进一步重写。当应用于方法和属性时,sealed修饰符必须始终与override一起使用。
sealed class SealedClass
{
public int x;
public int y;
}
上面的例子如果试图继承SealedClass则会报错。
注意:
将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。
结构是隐式密封的;因此它们不能被继承。
override
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
注意:
override 方法提供从基类继承的成员的新实现。通过 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。
不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
abstract
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
// abstract_keyword.cs
// Abstract Classes
using System;
abstract class BaseClass // Abstract class
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod(); // Abstract method
public abstract int X { get; }
public abstract int Y { get; }
public void a(){
}
}
class DerivedClass : BaseClass
{
public void a(){}//不会报错,但会提示该方法隐藏了父类中的a方法,如果是有意隐藏,请使用关键字new修饰
public override void a(){} //错误,因为父类中的a方法不是virtual、abstract 或 override所修饰
new public void a(){}
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
在 C# 中,new 关键字可用作运算符、修饰符或约束。
new 运算符
用于创建对象和调用构造函数。
new 修饰符
用于向基类成员隐藏继承成员。
当作为修饰符时,不能和override一起使用,两者互斥
new 约束
用于在泛型声明中约束可能用作类型参数的参数的类型。
new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数,如下面的示例所示:
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
当与其他约束一起使用时,new() 约束必须最后指定:
using System;
public class ItemFactory<T>
where T : IComparable, new()
{
}
virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许(不是必须)在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
public virtual double Area()
{
return x * y;
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
密封类不能被继承,密封方法重写基类方法,但不能被任何派生类进一步重写。当应用于方法和属性时,sealed修饰符必须始终与override一起使用。
sealed class SealedClass
{
public int x;
public int y;
}
上面的例子如果试图继承SealedClass则会报错。
注意:
将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。
结构是隐式密封的;因此它们不能被继承。
override
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
注意:
override 方法提供从基类继承的成员的新实现。通过 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。
不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
abstract
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
// abstract_keyword.cs
// Abstract Classes
using System;
abstract class BaseClass // Abstract class
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod(); // Abstract method
public abstract int X { get; }
public abstract int Y { get; }
public void a(){
}
}
class DerivedClass : BaseClass
{
public void a(){}//不会报错,但会提示该方法隐藏了父类中的a方法,如果是有意隐藏,请使用关键字new修饰
public override void a(){} //错误,因为父类中的a方法不是virtual、abstract 或 override所修饰
new public void a(){}
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
在 C# 中,new 关键字可用作运算符、修饰符或约束。
new 运算符
用于创建对象和调用构造函数。
new 修饰符
用于向基类成员隐藏继承成员。
当作为修饰符时,不能和override一起使用,两者互斥
new 约束
用于在泛型声明中约束可能用作类型参数的参数的类型。
new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数,如下面的示例所示:
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
当与其他约束一起使用时,new() 约束必须最后指定:
using System;
public class ItemFactory<T>
where T : IComparable, new()
{
}
virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许(不是必须)在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
public virtual double Area()
{
return x * y;
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}