日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接口和类

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口和类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接口
????????其實,接口簡單理解就是一種約定,使得實現接口的類或結構在形式上保持一致。個人覺得,使用接口可以使程序更加清晰和條理化,這就是接口的好處,但并不是所有的編程語言都支持接口,C#是支持接口的。注意,雖然在概念上,C#接口類似于COM接口,但他們的底層結構是不同的。那么,我們來看一下如何聲明和使用接口。
  聲明接口在語法上和聲明抽象類完全相同,例如這里有一個銀行賬戶的接口:
public?interface?IBankAccount
{
????
void?PayIn(decimal?amount);
????
bool?Withdraw(decimal?amount);

????
decimal?Balance
????{
????????
get;
????}
}

注意:接口中只能包含方法、屬性、索引器和事件的聲明。不允許聲明成員上的修飾符,即使是pubilc都不行,因為接口成員總是公有的,也不能聲明為虛擬和靜態的。如果需要修飾符,最好讓實現類來聲明。
????????使用接口的例子
  這是書上的一個簡單的例子,但足以說明接口的使用方法。
  一個銀行賬戶的接口,兩個不同銀行賬戶的實現類,都繼承于這個接口。接口聲明如上。下面是兩個賬戶類:
class?SaverAccount?:?IBankAccount
{
????
private?decimal?balance;

????
public?decimal?Balance
????{
????????
get?
????????{
????????????
return?balance;????
????????}
????}

????
public?void?PayIn(decimal?amount)
????{
????????balance?
+=?amount;
????}

????
public?bool?Withdraw(decimal?amount)
????{
????????
if?(balance?>=?amount)
????????{
????????????balance?
-=?amount;
????????????
return?true;
????????}
????????Console.WriteLine(
"Withdraw?failed.");
????????
return?false;
????}

????
public?override?string?ToString()
????{
????????
return?String.Format("Venus?Bank?Saver:Balance={0,6:C}",?balance);
????}
}

class?GoldAccount?:?IBankAccount
{
????
private?decimal?balance;

????
public?decimal?Balance
????{
????????
get?
????????{
????????????
return?balance;
????????}
????}

????
public?void?PayIn(decimal?amount)
????{
????????balance?
+=?amount;
????}

????
public?bool?Withdraw(decimal?amount)
????{
????????
if?(balance?>=?amount)
????????{
????????????balance?
-=?amount;
????????????
return?true;
????????}
????????Console.WriteLine(
"Withdraw?failed.");
????????
return?false;
????}

????
public?override?string?ToString()
????{
????????
return?String.Format("Jupiter?Bank?Saver:Balance={0,6:C}",?balance);
????}
}

可見,這兩個實現類多繼承了IBankAccount接口,因此它們必須要實現接口中的所有聲明的方法。要不然,編譯就會出錯。讓我們來測試一下,下面是測試代碼:
static?void?Main(string[]?args)
{
????IBankAccount?venusAccount?
=?new?SaverAccount();
????IBankAccount?jupiterAccount?
=?new?CurrentAccount();
????venusAccount.PayIn(
200);
????jupiterAccount.PayIn(
500);
????Console.WriteLine(venusAccount.ToString());
????jupiterAccount.PayIn(
400);
????jupiterAccount.Withdraw(
500);
????jupiterAccount.Withdraw(
100);
????Console.WriteLine(jupiterAccount.ToString());

}

????????請注意開頭兩句,我們把它們聲明為IBankAccount引用的方式,而沒有聲明為類的引用,為什么呢?因為,這樣我們就可以讓它指向執行這個接口的任何類的實例了,比較靈活。但這也有個缺點,如果我們要執行不屬于接口的方法,比如這里重載的ToString()方法,就要先把接口的引用強制轉換成合適的類型了。
????????接口的繼承
  接口也可以彼此繼承,就象類的繼承一樣。比如我們又聲明一個接口ITransferBankAccount,它繼承于IBankAccount接口。

interface?ITransferBankAccount?:?IBankAccount?
{
????
bool?TransferTo(IBankAccount?destination,?decimal?amount);
}

在這個接口中,又新增加了一個方法TransferTo(),所以如果我們要寫一個類從ITransferBankAccount繼承的話,就必須要實現IBankAccount和ITransferBankAccount兩個接口所有的方法聲明。即:

class?CurrentAccount?:?ITransferBankAccount
{
????
private?decimal?balance;

????
public?decimal?Balance
????
{
????????
get
????????
{
????????????
return?balance;
????????}

????}


????
public?void?PayIn(decimal?amount)
????
{
????????balance?
+=?amount;
????}


????
public?bool?Withdraw(decimal?amount)
????
{
????????
if?(balance?>=?amount)
????????
{
????????????balance?
-=?amount;
????????????
return?true;
????????}

????????Console.WriteLine(
"Withdraw?failed.");
????????
return?false;
????}


????
public?override?string?ToString()
????
{
????????
return?String.Format("Jupiter?Bank?Saver:Balance={0,6:C}",?balance);
????}


????
public?bool?TransferTo(IBankAccount?destination,?decimal?amount)
????
{
????????
if?(Withdraw(amount))
????????
{
????????????destination.PayIn(amount);
????????????
return?true;
????????}

????????
else
????????
{?
????????????
return?false;
????????}

????}

}

總結起來說,使用C#接口應注意幾個問題:

  1、C#中的接口是獨立于類來定義的。這與 C++模型是對立的,在 C++中接口實際上就是抽象基類。

  2、接口和類都可以繼承多個接口。

  3、類可以繼承一個基類,接口根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復雜機制。C#的簡化接口模型有助于加快應用程序的開發。

  4、一個接口定義一個只有抽象成員的引用類型。C#中一個接口實際所做的,僅僅只存在著方法標志,但根本就沒有執行代碼。這就暗示了不能實例化一個接口,只能實例化一個派生自該接口的對象。

  5、接口可以定義方法、屬性和索引。所以,對比一個類,接口的特殊性是:當定義一個類時,可以派生自多重接口,而你只能可以從僅有的一個類派生。

?類

類是一種數據結構,它可以包含數據成員,函數成員和嵌套類型,類支持繼承。

?面向對象概述

了解類之前先來了解下面向對象的特點吧!

·封裝。類的屬性和方法的集合,為了實現某項功能而定義類后,開發人員并不需要了解類體內每句代碼的含義,只需通過對象來調用類內某個屬性或方法即可實現某項功能,這就是類的封裝性。

·繼承。通過繼承可以創建子類和父類之間的層次關系,子類可以從其父類中繼承屬性和方法,通過這種關系模型可以簡化類的操作。

·多態性。類的多態性指不同的類進行同一操作可以有不同的行為。

大家可以看出上面介紹面向對象的概述基本上都是以類做描述對象,說明了類在面向對象中舉足輕重的地位哦,下面就來介紹下類吧!

類的概念

類是對象概念在面向對象編程語言中的反映,是相同對象的集合,類描述了一系列在概念上有相同的含義的對象,并為這些對象同一定義了編程語言上的屬性和方法。例如:車是一個類,自行車、汽車、火車也是類。但是他們的具體的屬性和方法可能不完全相同。

類的面向對象特性

·類的封裝

面向對象編程中,大多數都是以類作為數據封裝的基本單位。類將數據和操作數據的方法結合成一個單位。設計類時,不希望直接存取類中的數據,而希望通過方法來存取數據,這樣就可以達到封裝數據的目的,方便以后的升級和維護,也可以在操作數據時多一層判斷。

·類的繼承

利用類的繼承機制,用戶可以通過增加、修改或替換類中的方法對這個類進行擴充,以適應不同的應用要求。利用繼承,程序開發人員可以在已有類的基礎上構造新類,這一性質使得類支持分類的概念。

·類的多態

多態使得子類的實例可以直接賦予基類的變量(這里不需要進行強制類型轉換),然后直接就可以通過這個變量調用子類的方法。

????????當子類從基類繼承時,它會獲得基類的所有方法、字段、屬性和事件。若要更改基類的數據和行為,有兩種選擇:可以使用新的派生成員替換基成員,或者可以重寫虛擬的基成員。另外,開發人員還可以使用新的派生成員替換基類的成員,這時需要使用new關鍵字。如果基類定義了一個方法、字段或屬性,則new關鍵字用于在子類中創建該方法、字段或屬性的新定義。new關鍵字放置在要替換的類成員的返回類型之前。

轉載于:https://www.cnblogs.com/sixstar01/archive/2012/11/09/2762721.html

總結

以上是生活随笔為你收集整理的接口和类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。