設計模式 派生類實現非虛介面的陷阱

2021-07-27 20:36:19 字數 1905 閱讀 3253

文獻:msdn library

平台:.net 2.0+

第一眼看來,實現介面和覆寫虛方法似乎沒有什麼區別,實際上,實現介面和覆寫虛方法之間的差別很大!!!

介面中宣告的成員方法預設情況下並非虛方法,所以,派生類不能覆寫基類中實現介面的非虛成員。

看乙個例子。

定義介面itest:

public

inte***ce itest

實現介面的base類和derive類

public

class base:itest

//實現itest介面

public

void

test()

}public

class derive :base,itest

//測試derive類實現了itest嗎??

public

void

test()

}

呼叫物件base和derive:

base b = new base();

b.test();

base d = new derive();//將d宣告為base物件

d.test();

console.readline();

輸出結果為:

可以看出,b和d例項的test方法實現的行為都是位於基類的!!!這表明了,派生類不能覆寫基類中實現介面的成員(非虛方法)

但是,請看下面呼叫:

base b = new base();

b.test();

derive d = new derive(); //將d宣告為derive物件

d.test();

console.readline();

輸出結果為:

因此,如果想要繼承的物件呼叫介面實現方法,只能宣告為derive例項。這樣做不符合effective c#中變數都宣告為基例項的原則!!!

避免這種使用上的混淆,如果確實派生類實現方法是個性行為,那麼需要將基類的實現介面的方法前加virtual修飾符!

**修改如下:

public

class base:itest

public

virtual

void

test() //實現itest介面的虛方法

}public

class derive :base,itest

public

override

void

test() //實現介面itest的複寫方法

}

觀察上面的**,我們發現,在基類中實現的介面,如果派生類也想實現此介面,那麼它預設繼承了基類的介面實現,所以不用重複寫**實現介面。

public

inte***ce itest

public

class base:itest

public

void

test()

}public

class derive :base,itest

}

總結:

1、 派生不能覆寫介面的非虛成員;

2、如果派生類方法是個性方法,將基類方法轉為虛方法;

3、若基類實現了介面方法,將派生類也顯示地繼承此介面,但是不用再次實現了!!!

JavaScript 設計模式之介面的實現

在js中,並沒有真正意義上的介面,我們只能通過模擬的方式實現介面的效果,使用介面可以促進 的重用,降低 之間的耦合度,減少 錯誤及查詢錯誤原因,壞處就是加大 量,而且並不能強制程式設計師實現介面。js中模擬介面的方式有三種。這種方式是使用注釋顯示的告訴程式設計師需要實現哪些介面,這種方式完全靠程式設...

c 實現單例模式以及單例的派生類

單例模式 乙個類只用乙個物件,如果使用者建立多個物件需要返回錯誤,建構函式只能被訪問一次,不能給使用者隨便訪問建構函式的介面,即建構函式不能是public型別的。每個使用者在不知道這個類唯一例項的情況下都可以快速訪問這個物件。那麼就必須有乙個函式需要返回該例項,並且該函式可以不適用物件進行呼叫,那麼...

設計模式 橋接模式 建構函式傳遞介面的實現

public inte ce payscene 刷臉支付 public class facepayscene implements payscene 密碼支付 public class secretpayscene implements payscene 支付方式抽象類 將支付場景作為支付方式構造引...