abstract, virtual, override, new 關(guān)鍵字的用法
簡(jiǎn)單一點(diǎn)來(lái)說(shuō),相見(jiàn)msdn的介紹。
virtual:包含函數(shù)體,繼承類(lèi)無(wú)需重寫(xiě),當(dāng)然也可以重寫(xiě);
abstract:不包含函數(shù)體,繼承類(lèi)必須重寫(xiě);
new:一般方法,繼承類(lèi)想覆蓋之,采用new關(guān)鍵字進(jìn)行;
using System;
using System.Collections.Generic;
using System.Text;
namespace Keywords
{
public abstract class ShapeClass
{
public string GetShapeName()
{
return "shape class";
}
public abstract int Area();
public virtual int Volume()
{
return 11;
}
}
public class Square : ShapeClass
{
// 采用new關(guān)鍵字重寫(xiě)基類(lèi)一般方法
public new string GetShapeName()
{
return "square";
}
// 必須重寫(xiě)
public override int Area()
{
return 22;
}
// 可以重寫(xiě),也可以不重寫(xiě)
public override int Volume()
{
//return base.Volume();
return 33;
}
}
public class Program
{
public static void Main(string[] args)
{
Square square = new Square();
Console.WriteLine(square.GetShapeName());
Console.WriteLine(square.Area());
Console.WriteLine(square.Volume());
Console.ReadLine();
}
}
}
附錄:msdn的介紹
abstract 修飾符可以和類(lèi)、方法、屬性、索引器及事件一起使用。在類(lèi)聲明中使用 abstract 修飾符以指示某個(gè)類(lèi)只能是其他類(lèi)的基類(lèi)。標(biāo)記為抽象或包含在抽象類(lèi)中的成員必須通過(guò)從抽象類(lèi)派生的類(lèi)來(lái)實(shí)現(xiàn)。
在此例中,類(lèi) Square 必須提供 Area 的實(shí)現(xiàn),因?yàn)樗缮?ShapesClass:
| 復(fù)制代碼 | |
|---|---|
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int x, y;
// Not providing an Area method results
// in a compile-time error.
public override int Area()
{
return x * y;
}
}
|
|
有關(guān)抽象類(lèi)的更多信息,請(qǐng)參見(jiàn)抽象類(lèi)、密封類(lèi)及類(lèi)成員(C# 編程指南)。
備注
抽象類(lèi)具有以下特性:
-
抽象類(lèi)不能實(shí)例化。
-
抽象類(lèi)可以包含抽象方法和抽象訪問(wèn)器。
-
不能用 sealed(C# 參考)修飾符修改抽象類(lèi),這意味著抽象類(lèi)不能被繼承。
-
從抽象類(lèi)派生的非抽象類(lèi)必須包括繼承的所有抽象方法和抽象訪問(wèn)器的實(shí)實(shí)現(xiàn)。
在方法或?qū)傩月暶髦惺褂?abstract 修飾符以指示方法或?qū)傩圆话瑢?shí)現(xiàn)。
抽象方法具有以下特性:
-
抽象方法是隱式的虛方法。
-
只允許在抽象類(lèi)中使用抽象方法聲明。
-
因?yàn)槌橄蠓椒暶鞑惶峁?shí)際的實(shí)現(xiàn),所以沒(méi)有方法體;方法聲明只是以一個(gè)分號(hào)結(jié)束,并且在簽名后沒(méi)有大括號(hào) ({ })。例如:
復(fù)制代碼 public abstract void MyMethod();
-
實(shí)現(xiàn)由一個(gè)重寫(xiě)方法提供,此重寫(xiě)方法是非抽象類(lèi)的成員。
除了在聲明和調(diào)用語(yǔ)法上不同外,抽象屬性的行為與抽象方法一樣。
-
在靜態(tài)屬性上使用 abstract 修飾符是錯(cuò)誤的。
-
在派生類(lèi)中,通過(guò)包括使用 override 修飾符的屬性聲明,可以重寫(xiě)抽象的繼承屬性。
抽象類(lèi)必須為所有接口成員提供實(shí)現(xiàn)。
實(shí)現(xiàn)接口的抽象類(lèi)可以將接口方法映射到抽象方法上。例如:
| 復(fù)制代碼 | |
|---|---|
interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
|
|
示例
在本例中,DerivedClass 類(lèi)是從抽象類(lèi) BaseClass 派生的。抽象類(lèi)包含一個(gè)抽象方法 AbstractMethod 和兩個(gè)抽象屬性 X 和 Y。
| 復(fù)制代碼 | |
|---|---|
// 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; }
}
class DerivedClass : BaseClass
{
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);
}
}
|
|
輸出
x = 111, y = 161 |
|
注釋
在上面的示例中,如果試圖通過(guò)使用下面的語(yǔ)句將抽象類(lèi)實(shí)例化:
| 復(fù)制代碼 | |
|---|---|
BaseClass bc = new BaseClass(); // Error |
|
將出現(xiàn)錯(cuò)誤,指出編譯器無(wú)法創(chuàng)建抽象類(lèi)“BaseClass”的實(shí)例。
virtual 關(guān)鍵字用于修飾方法、屬性、索引器或事件聲明,并且允許在派生類(lèi)中重寫(xiě)這些對(duì)象。例如,此方法可被任何繼承它的類(lèi)重寫(xiě)。
| 復(fù)制代碼 | |
|---|---|
public virtual double Area()
{
return x * y;
}
|
|
虛擬成員的實(shí)現(xiàn)可由派生類(lèi)中的重寫(xiě)成員更改。有關(guān)使用 virtual 關(guān)鍵字的更多信息,請(qǐng)參見(jiàn)使用 Override 和 New 關(guān)鍵字控制版本(C# 編程指南)和了解何時(shí)使用 Override 和 New 關(guān)鍵字(C# 編程指南)。
備注
調(diào)用虛方法時(shí),將為重寫(xiě)成員檢查該對(duì)象的運(yùn)行時(shí)類(lèi)型。將調(diào)用大部分派生類(lèi)中的該重寫(xiě)成員,如果沒(méi)有派生類(lèi)重寫(xiě)該成員,則它可能是原始成員。
默認(rèn)情況下,方法是非虛擬的。不能重寫(xiě)非虛方法。
virtual 修飾符不能與 static、abstract 和 override 修飾符一起使用。
除了聲明和調(diào)用語(yǔ)法不同外,虛擬屬性的行為與抽象方法一樣。
-
在靜態(tài)屬性上使用 virtual 修飾符是錯(cuò)誤的。
-
通過(guò)包括使用 override 修飾符的屬性聲明,可在派生類(lèi)中重寫(xiě)虛擬繼承屬性。
示例
在該示例中,Dimensions 類(lèi)包含 x 和 y 兩個(gè)坐標(biāo)和 Area() 虛方法。不同的形狀類(lèi),如 Circle、Cylinder 和 Sphere 繼承 Dimensions 類(lèi),并為每個(gè)圖形計(jì)算表面積。每個(gè)派生類(lèi)都有各自的 Area() 重寫(xiě)實(shí)現(xiàn)。根據(jù)與此方法關(guān)聯(lián)的對(duì)象,通過(guò)調(diào)用正確的 Area() 實(shí)現(xiàn),該程序?yàn)槊總€(gè)圖形計(jì)算并顯示正確的面積。
在前面的示例中,注意繼承的類(lèi) Circle、Sphere 和 Cylinder 都使用了初始化基類(lèi)的構(gòu)造函數(shù),例如:
| 復(fù)制代碼 | |
|---|---|
public Cylinder(double r, double h): base(r, h) {}
|
|
這類(lèi)似于 C++ 的初始化列表。
| 復(fù)制代碼 | |
|---|---|
// cs_virtual_keyword.cs
using System;
class TestClass
{
public class Dimensions
{
public const double PI = Math.PI;
protected double x, y;
public Dimensions()
{
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
public class Circle : Dimensions
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Dimensions
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
class Cylinder : Dimensions
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Dimensions c = new Circle(r);
Dimensions s = new Sphere(r);
Dimensions l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
|
|
輸出
Area of Circle = 28.27
Area of Sphere = 113.10
Area of Cylinder = 150.80
|
|
出處:http://mjgforever.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明。
posted on 2008-11-28 10:06 mjgforever 閱讀(706) 評(píng)論(0) 收藏 舉報(bào)


浙公網(wǎng)安備 33010602011771號(hào)