欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

探索C#中的接口實(shí)現(xiàn):隱式 vs. 顯式

admin
2024年2月21日 12:7 本文熱度 619

概述:C#中的接口實(shí)現(xiàn)可以是隱式或顯式的。隱式實(shí)現(xiàn)是常見(jiàn)的,但顯式實(shí)現(xiàn)提供了更多控制權(quán),尤其適用于特定情況,如接口方法不想公開(kāi)在類(lèi)上的情況。顯式實(shí)現(xiàn)的調(diào)用需要通過(guò)接口訪問(wèn),這可以在特定需求下提供更好的靈活性和可維護(hù)性。

介紹

在 C# 中,可以隱式或顯式方式實(shí)現(xiàn)接口。在大多數(shù)情況下,我們使用的是隱式接口實(shí)現(xiàn),即您有一個(gè)具有相同接口簽名的方法。

internal interface IMyInterface
{
    void SayHello();
}
internal class ImplicitImplementation : IMyInterface
{
    public void SayHello()
     {
        Console.WriteLine("ImplicitImplementation says hello.");
    }
}

顯式接口實(shí)現(xiàn)是通過(guò)在接口方法前面加上接口名稱(chēng)和句點(diǎn)來(lái)定義的。該方法只能通過(guò)指定的接口訪問(wèn)。

internal class ExplicitImplementation : IMyInterface
{
    void IMyInterface.SayHello()
     {
        Console.WriteLine("ExplicitImplementation says hello.");
    }
}

請(qǐng)注意,該方法沒(méi)有公共訪問(wèn)修飾符,因?yàn)樗荒芡ㄟ^(guò)接口訪問(wèn)。

IMyInterface v1 = new ExplicitImplementation();
v1.SayHello();

何時(shí)必須使用顯式接口實(shí)現(xiàn)?

在以下情況下,必須使用顯式接口實(shí)現(xiàn):

類(lèi)實(shí)現(xiàn)兩個(gè)具有相同方法簽名的接口。

internal interface IControl{    void Paint();}
internal interface ICanvas{    void Paint();}internal class MyControl : IControl, ICanvas{    void IControl.Paint()    {        Console.WriteLine("IControl.Paint()");    }    void ICanvas.Paint()    {        Console.WriteLine("ICanvas.Paint()");    }}
var control = new MyControl();((IControl)control).Paint();((ICanvas)control).Paint();

  1. 您不想在類(lèi)類(lèi)型上公開(kāi)接口方法。您希望用戶(hù)將類(lèi)型強(qiáng)制轉(zhuǎn)換為接口以訪問(wèn)該方法。

internal class ExplicitImplementation : IMyInterface{    void IMyInterface.SayHello()     {        Console.WriteLine("ExplicitImplementation says hello.");    }}
// The following two lines would cause compile error// 'ExplicitImplementation' does not contain a definition for 'SayHello'ExplicitImplementation v1 = new ExplicitImplementation();v1.SayHello();
// The following lines are OKIMyInterface v1 = new ExplicitImplementation();v1.SayHello();

在上面的代碼中,SayHello() 方法無(wú)法通過(guò)對(duì)象實(shí)例訪問(wèn)。您必須將其轉(zhuǎn)換為接口才能訪問(wèn)它。

當(dāng)涉及繼承時(shí),事情會(huì)變得復(fù)雜。假設(shè)您的基類(lèi)和子類(lèi)都必須實(shí)現(xiàn)相同的接口(隱式或顯式),在不同的場(chǎng)景中調(diào)用哪個(gè)實(shí)現(xiàn)?有很多組合。我們?cè)谶@里只討論兩種情況。

基類(lèi)和子類(lèi)都使用隱式接口實(shí)現(xiàn)

internal class ImplicitImplementation : IMyInterface{    public void SayHello()     {        Console.WriteLine("ImplicitImplementation says hello.");    }}internal class ImplicitImplementationSubClass : ImplicitImplementation, IMyInterface{    public void SayHello()     {        Console.WriteLine("ImplicitImplementationSubClass says hello.");    }}
ImplicitImplementation v3 = new ImplicitImplementation();v3.SayHello();
ImplicitImplementation v4 = new ImplicitImplementationSubClass();v4.SayHello();
IMyInterface v5 = new ImplicitImplementationSubClass();v5.SayHello();

// Output

ImplicitImplementation says hello. ImplicitImplementation says hello. ImplicitImplementationSubClass says hello.

這里的輸出有點(diǎn)有趣:第一個(gè)是顯而易見(jiàn)的。第二個(gè)和第三個(gè)值得解釋。

對(duì)于第二個(gè) (v4),運(yùn)行時(shí)調(diào)用基類(lèi) ImplicitImplementation 中的接口實(shí)現(xiàn),因?yàn)楫?dāng)基類(lèi)和子類(lèi)都隱式實(shí)現(xiàn)相同的接口時(shí),子類(lèi)實(shí)現(xiàn)會(huì)隱藏基類(lèi)實(shí)現(xiàn)。

對(duì)于第三個(gè) (v5),運(yùn)行時(shí)調(diào)用子類(lèi)中的接口實(shí)現(xiàn),因?yàn)?v5 實(shí)例是從子類(lèi)構(gòu)造并強(qiáng)制轉(zhuǎn)換為接口的。

基類(lèi)和子類(lèi)都使用顯式接口實(shí)現(xiàn)

internal class ExplicitImplementation : IMyInterface{    void IMyInterface.SayHello()     {        Console.WriteLine("ExplicitImplementation says hello.");    }}internal class ExplicitImplementationSubClass : ExplicitImplementation, IMyInterface{    void IMyInterface.SayHello()    {        Console.WriteLine("ExplicitImplementationSubClass says hello explicitly.");    }    public void SayHello()    {        Console.WriteLine("ExplicitImplementationSubClass says hello implicitly.");    }}
IMyInterface v1 = new ExplicitImplementation();v1.SayHello();
IMyInterface v2 = new ExplicitImplementationSubClass();v2.SayHello();
ExplicitImplementationSubClass v2_1 = new ExplicitImplementationSubClass();v2_1.SayHello();

/// Output

ExplicitImplementation says hello. ExplicitImplementationSubClass says hello explicitly. ExplicitImplementationSubClass says hello implicitly.

這里的輸出更清晰易懂。顯式接口實(shí)現(xiàn)只能通過(guò)接口訪問(wèn)。根據(jù)強(qiáng)制轉(zhuǎn)換為接口的真實(shí)對(duì)象實(shí)例,運(yùn)行時(shí)將觸發(fā)該對(duì)象實(shí)例的接口實(shí)現(xiàn)。

您可以隱式和顯式實(shí)現(xiàn)接口。運(yùn)行時(shí)將調(diào)用正確的實(shí)現(xiàn),具體取決于您是使用接口還是類(lèi)對(duì)象來(lái)調(diào)用它。第三個(gè)輸出 (v2_1) 演示了從類(lèi)對(duì)象調(diào)用時(shí),運(yùn)行時(shí)將選擇隱式接口實(shí)現(xiàn)。


該文章在 2024/2/21 12:11:59 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved