多用戶智能網(wǎng)站建設(shè)源碼洛陽(yáng)網(wǎng)站seo
接口,多態(tài)性,密封類
C# 接口
遙控器是觀眾和電視之間的接口。 它是此電子設(shè)備的接口。 外交禮儀指導(dǎo)外交領(lǐng)域的所有活動(dòng)。 道路規(guī)則是駕車者,騎自行車者和行人必須遵守的規(guī)則。 編程中的接口類似于前面的示例。
接口是:
- APIs
- Contracts
對(duì)象通過(guò)其公開(kāi)的方法與外界交互。 實(shí)際的實(shí)現(xiàn)對(duì)程序員而言并不重要,或者也可能是秘密的。 公司可能會(huì)出售圖書館,但它不想透露實(shí)際的實(shí)施情況。 程序員可能會(huì)在 GUI 工具箱的窗口上調(diào)用Maximize()
方法,但對(duì)如何實(shí)現(xiàn)此方法一無(wú)所知。 從這個(gè)角度來(lái)看,接口是對(duì)象與外界交互的方式,而又不會(huì)過(guò)多地暴露其內(nèi)部功能。
從第二個(gè)角度來(lái)看,接口就是契約。 如果達(dá)成協(xié)議,則必須遵循。 它們用于設(shè)計(jì)應(yīng)用的體系結(jié)構(gòu)。 他們幫助組織代碼。
接口是完全抽象的類型。 它們使用interface
關(guān)鍵字聲明。 接口只能具有方法,屬性,事件或索引器的簽名。 所有接口成員都隱式具有公共訪問(wèn)權(quán)限。 接口成員不能指定訪問(wèn)修飾符。 接口不能具有完全實(shí)現(xiàn)的方法,也不能具有成員字段。 C# 類可以實(shí)現(xiàn)任何數(shù)量的接口。 一個(gè)接口還可以擴(kuò)展任何數(shù)量的接口。 實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口的所有方法簽名。
接口用于模擬多重繼承。 C# 類只能從一個(gè)類繼承,但可以實(shí)現(xiàn)多個(gè)接口。 使用接口的多重繼承與繼承方法和變量無(wú)關(guān)。 它是關(guān)于繼承想法或合同的,這些想法或合同由接口描述。
接口和抽象類之間有一個(gè)重要的區(qū)別。 抽象類為繼承層次結(jié)構(gòu)中相關(guān)的類提供部分實(shí)現(xiàn)。 另一方面,可以通過(guò)彼此不相關(guān)的類來(lái)實(shí)現(xiàn)接口。 例如,我們有兩個(gè)按鈕。 經(jīng)典按鈕和圓形按鈕。 兩者都繼承自抽象按鈕類,該類為所有按鈕提供了一些通用功能。 實(shí)現(xiàn)類是相關(guān)的,因?yàn)樗鼈兌际前粹o。 另一個(gè)示例可能具有類Database
和SignIn
。 它們彼此無(wú)關(guān)。 我們可以應(yīng)用ILoggable
接口,該接口將迫使他們創(chuàng)建執(zhí)行日志記錄的方法。
C# 簡(jiǎn)單接口
以下程序使用一個(gè)簡(jiǎn)單的接口。
Program.
using System;namespace SimpleInterface
{interface IInfo{void DoInform();}class Some : IInfo{public void DoInform(){Console.WriteLine("This is Some Class");}}class Program{static void Main(string[] args){var some = new Some();some.DoInform();}}
}
這是一個(gè)演示接口的簡(jiǎn)單 C# 程序。
interface IInfo
{void DoInform();
}
這是接口IInfo
。 它具有DoInform()
方法簽名。
class Some : IInfo
我們實(shí)現(xiàn)了IInfo
接口。 為了實(shí)現(xiàn)特定的接口,我們使用冒號(hào)(:)運(yùn)算符。
public void DoInform()
{Console.WriteLine("This is Some Class");
}
該類提供了DoInform()
方法的實(shí)現(xiàn)。
C# 多個(gè)接口
下一個(gè)示例顯示了一個(gè)類如何實(shí)現(xiàn)多個(gè)接口。
Program.
using System;namespace MultipleInterfaces
{interface Device{void SwitchOn();void SwitchOff();}interface Volume{void VolumeUp();void VolumeDown();}interface Pluggable{void PlugIn();void PlugOff();}class CellPhone : Device, Volume, Pluggable{public void SwitchOn(){Console.WriteLine("Switching on");}public void SwitchOff(){Console.WriteLine("Switching on");}public void VolumeUp(){Console.WriteLine("Volume up");}public void VolumeDown(){Console.WriteLine("Volume down");}public void PlugIn(){Console.WriteLine("Plugging In");}public void PlugOff(){Console.WriteLine("Plugging Off");}}class Program{static void Main(string[] args){var cellPhone = new CellPhone();cellPhone.SwitchOn();cellPhone.VolumeUp();cellPhone.PlugIn();}}
}
我們有一個(gè)CellPhone
類,它從三個(gè)接口繼承。
class CellPhone : Device, Volume, Pluggable
該類實(shí)現(xiàn)所有三個(gè)接口,并用逗號(hào)分隔。?CellPhone
類必須實(shí)現(xiàn)來(lái)自所有三個(gè)接口的所有方法簽名。
$ dotnet run
Switching on
Volume up
Plugging In
運(yùn)行程序,我們得到此輸出。
C# 多接口繼承
下一個(gè)示例顯示接口如何從多個(gè)其他接口繼承。
Program.
using System;namespace InterfaceInheritance
{interface IInfo{void DoInform();}interface IVersion{void GetVersion();}interface ILog : IInfo, IVersion{void DoLog();}class DBConnect : ILog{public void DoInform(){Console.WriteLine("This is DBConnect class");}public void GetVersion(){Console.WriteLine("Version 1.02");}public void DoLog(){Console.WriteLine("Logging");}public void Connect(){Console.WriteLine("Connecting to the database");}}class Program{static void Main(string[] args){var db = new DBConnect();db.DoInform();db.GetVersion();db.DoLog();db.Connect();}}
}
我們定義了三個(gè)接口。 我們可以按層次結(jié)構(gòu)組織接口。
interface ILog : IInfo, IVersion
ILog
接口繼承自其他兩個(gè)接口。
public void DoInform()
{Console.WriteLine("This is DBConnect class");
}
DBConnect
類實(shí)現(xiàn)DoInform()
方法。 該方法由該類實(shí)現(xiàn)的ILog
接口繼承。
$ dotnet run
This is DBConnect class
Version 1.02
Logging
Connecting to the database
這是輸出。
C# 多態(tài)性
多態(tài)是以不同方式將運(yùn)算符或函數(shù)用于不同數(shù)據(jù)輸入的過(guò)程。 實(shí)際上,多態(tài)性意味著如果類 B 從類 A 繼承,那么它不必繼承關(guān)于類 A 的所有內(nèi)容。 它可以完成 A 類所做的某些事情。
通常,多態(tài)性是以不同形式出現(xiàn)的能力。 從技術(shù)上講,它是重新定義派生類的方法的能力。 多態(tài)性與將特定實(shí)現(xiàn)應(yīng)用于接口或更通用的基類有關(guān)。
多態(tài)性是重新定義派生類的方法的能力。
Program.
using System;namespace Polymorphism
{abstract class Shape{protected int x;protected int y;public abstract int Area();}class Rectangle : Shape{public Rectangle(int x, int y){this.x = x;this.y = y;}public override int Area(){return this.x * this.y;}}class Square : Shape{public Square(int x){this.x = x;}public override int Area(){return this.x * this.x;}}class Program{static void Main(string[] args){Shape[] shapes = { new Square(5), new Rectangle(9, 4), new Square(12) };foreach (Shape shape in shapes){Console.WriteLine(shape.Area());}}}
}
在上面的程序中,我們有一個(gè)抽象的Shape
類。 此類演變?yōu)閮蓚€(gè)后代類別:Rectangle
和Square
。 兩者都提供了自己的Area()
方法實(shí)現(xiàn)。 多態(tài)為 OOP 系統(tǒng)帶來(lái)了靈活性和可伸縮性。
public override int Area()
{return this.x * this.y;
}
...
public override int Area()
{return this.x * this.x;
}
Rectangle
和Square
類具有Area()
方法的自己的實(shí)現(xiàn)。
Shape[] shapes = { new Square(5), new Rectangle(9, 4), new Square(12) };
我們創(chuàng)建三個(gè)形狀的數(shù)組。
foreach (Shape shape in shapes)
{Console.WriteLine(shape.Area());
}
我們遍歷每個(gè)形狀,并在其上調(diào)用Area()
方法。 編譯器為每種形狀調(diào)用正確的方法。 這就是多態(tài)性的本質(zhì)。
C# 密封類
sealed
關(guān)鍵字用于防止意外地從類派生。 密封類不能是抽象類。
Program.
using System;namespace DerivedMath
{sealed class Math{public static double GetPI(){return 3.141592;}}class Derived : Math{public void Say(){Console.WriteLine("Derived class");}}class Program{static void Main(string[] args){var dm = new Derived();dm.Say();}}
}
在上面的程序中,我們有一個(gè)Math
基類。 該類的唯一目的是為程序員提供一些有用的方法和常量。 (出于簡(jiǎn)單起見(jiàn),在我們的案例中,我們只有一種方法。)它不是從繼承而創(chuàng)建的。 為了防止不知情的其他程序員從此類中派生,創(chuàng)建者創(chuàng)建了sealed
類。 如果嘗試編譯該程序,則會(huì)出現(xiàn)以下錯(cuò)誤:’Derived’不能從密封類’Math’派生。