C# new,Virtual,abstract,sealed,Override的簡單理解

本文深入探讨了 C# 中 new、virtual、abstract、sealed 和 override 关键字的功能,通过具体代码示例展示了如何在类继承结构中利用这些特性进行方法隐藏、重写和抽象类的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/scottckt/archive/2007/09/26/906875.html

new

new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。
在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。

Virtual

Virtual关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与staticabstractprivateoverride一起使用。
Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用overridenew关键字(newoverride产生的机理不同)。

abstract

在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。抽象类不能实例化。
抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({ })。

sealed

密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。密封类不能被继承。
当应用于方法或属性时,sealed修饰符必须始终与override一起使用。

Override

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名


下邊用例字作簡單說明,例字比較繁瑣,僅作為參考!
例子的主要想法過程為:

基類A
B:A
abstract C:B
sealed D:C

類中包含的方法想法過程為:
方法 A
new A
virtual A
abstract A
override A
sealed override A

classProgram
{
/// <summary>
/// 定義一個基類"MyBaseClass"
/// </summary>
public classMyBaseClass
{
/// <summary>
/// 定義一個方法
/// </summary>
public voidDoA()
{
Console.WriteLine("MyBaseClass.BaseDoA()");
}
}

/// <summary>
/// 定義個繼存類MyInheritClass繼承MyBaseClass類
/// </summary>
public classMyInheritClass:MyBaseClass
{

/// <summary>
/// 此地方表示隱藏基類MyBaseClass中的DoA方法,並重寫方法
/// </summary>
new public voidDoA()
{
Console.WriteLine("MyBaseClass.InheritBaseDoA()");

// 運行基類MyBaseClass的DoA方法
base.DoA();
}

/// <summary>
/// 定義一個虛方法
/// </summary>
public virtual voidDoB()
{
Console.WriteLine("MyBaseClass.InheritBaseDoB()");
}
}

/// <summary>
/// 定義抽象類MyAbstractClass繼承類MyInheritClass
/// </summary>
/// abstract
public abstract classMyAbstractClass:MyInheritClass
{
/// <summary>
/// 隱MyInheritClass類的方法,重新定義抽象方法
/// </summary>
new public abstract voidDoA();
/// <summary>
/// 重寫基類MyInheritClass方法,此方法為新的方法
/// </summary>
public override voidDoB()
{
Console.WriteLine("MyBaseClass.abstractoverrideDoB()");

// 此時將調用MyInheritClass類中的方法
base.DoA();
}
}

/// <summary>
/// 定議密封類MySealedClass繼承抽像類MyAbstractClass
/// </summary>
public sealed classMySealedClass:MyAbstractClass
{
/// <summary>
/// 重寫基類MyAbstractClass的抽象方法
/// </summary>
public override voidDoA()
{
Console.WriteLine("MyBaseClass.sealedDoA()");
}

/// <summary>
/// 密封重寫MyAbstractClass方法
/// </summary>
public sealed override voidDoB()
{
Console.WriteLine("MyBaseClass.sealedoverrideDoB()");
}

public voidCallBase()
{
// 此時不是調用基類MyBaseClass(抽象類)的方法是調用MyAbstractClass類的方法
base.DoB();
// 此處報錯。因為繼承抽象的方法無法調用原始方法
// base.DoA();
}
}

static voidMain( string[]args)
{
// 實例化基類並調用基類方法
MyBaseClassBaseClasee= newMyBaseClass();
BaseClasee.DoA();

// 實例化繼承類,並調用繼承類方法
MyInheritClassInheritCalss= newMyInheritClass();
InheritCalss.DoA();
InheritCalss.DoB();

// 實例化密封類,並調用方法
MySealedClassSealedClass= newMySealedClass();
SealedClass.DoA();
SealedClass.DoB();
SealedClass.CallBase();
Console.ReadKey();
}
}


/*
*輸出結果
*MyBaseClass.BaseDoA()
*
*MyBaseClass.InheritBaseDoA()
*MyBaseClass.BaseDoA()
*MyBaseClass.InheritBaseDoB()
*
*MyBaseClass.sealedDoA()
*MyBaseClass.sealedoverrideDoB()
*
*MyBaseClass.abstractoverrideDoB()
*MyBaseClass.InheritBaseDoA()
*MyBaseClass.BaseDoA()
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值