若乙個例項方法的宣告中含有
virtual
修飾符,則稱該方法為虛方法
(virtual method)
。若其中沒有
virtual
修飾符,則稱該方法為非虛方法
(non-virtual method)
。在呼叫乙個虛方法時,該呼叫所涉及的那個例項的執行時型別
(runtime type)
確定要呼叫該方法的哪乙個實現。在非虛方法呼叫中,例項的編譯時型別
(compile-time type)
負責做出此決定。
虛方法可以在派生類中重寫
(override)
。當某個例項方法宣告包括
override
修飾符時,該方法將重寫所繼承的具有相同簽名的虛方法。虛方法宣告用於引入新方法,而重寫方法宣告則用於使現有的繼承虛方法專用化(通過提供該方法的新實現)。
抽象(abstract)
方法是沒有實現的虛方法。抽象方法使用
abstract
修飾符進行宣告,並且只允許出現在同樣被宣告為
abstract
的類中。抽象方法必須在每個非抽象派生類中重寫。
下面的示例宣告乙個抽象類
expression
,它表示乙個表示式目錄樹節點;它有三個派生類
constant
、variablereference
和operation
,它們分別實現了常量、變數引用和算術運算的表示式目錄樹節點
code
public
abstract
class
expression
public
class
constant : expression
public
override
double
evaluate(hashtable vars)
}public
class
variablereference : expression
public
override
double
evaluate(hashtable vars)
return
convert.todouble(value);}}
public
class
operation : expression
public
override
double
evaluate(hashtable vars)
throw
newexception(
"unknown operator");
}}**中呼叫了
expression
例項的evaluate
方法,以計算給定表示式的值,從而生成乙個
double
值。該方法接受乙個包含變數名稱(作為雜湊表項的鍵)和值(作為項的值)的
hashtable
作為引數。
evaluate
方法是乙個虛抽象方法,意味著非抽象派生類必須重寫該方法以提供具體的實現。
constant
的evaluate
實現只是返回所儲存的常量。
variablereference
的實現在雜湊表中查詢變數名稱,並返回產生的值。
operation
的實現先對左運算元和右運算元求值(通過遞迴呼叫它們的
evaluate
方法),然後執行給定的算術運算。
下面的程式使用
expression
類,對於不同的x和
y 值,計算表示式x*
(y+2)的值。
code
static
void
main(
string
args)
虛方法 重寫方法和抽象方法
若乙個例項方法的宣告中含有 virtual 修飾符,則稱該方法為虛方法 virtual method 若其中沒有 virtual 修飾符,則稱該方法為非虛方法 non virtual method 在呼叫乙個虛方法時,該呼叫所涉及的那個例項的執行時型別 runtime type 確定要呼叫該方法的哪...
C 虛方法和抽象方法
虛方法 1 virtual方法表示此方法可以被重寫,也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.2 virtual方法可以直接使用,和普通方法一樣 3 不是必須重寫的.子類可以使用base.方法 的方式呼叫,無論有沒有在子類使用override去重寫 vir...
C 虛方法和抽象方法
虛方法 1 virtual方法表示此方法可以被重寫,也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.2 virtual方法可以直接使用,和普通方法一樣 3 不是必須重寫的.子類可以使用base.方法 的方式呼叫,無論有沒有在子類使用override去重寫 vir...