1.C#類和介面的區別
介面是負責功能的定義,項目中通過介面來規範類,操作類以及抽象類別的概念!
而類是負責功能的具體實現!
在類中也有抽象類別的定義,抽象類別與介面的區別在於:
抽象類別是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。
但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面
PS:介面除了規範一個行為之外,在具體項目中的實際作用也是十分重要的,在物件導向的設計原則以及設計模式的使用中,無不體現作為一個介面的使用好處,最直接的就是設計原則中OCP(開放封閉原則),我們使用介面,而不需要關心他的具體實現,具體實現的細節變化也無關用戶端(使用介面的類)的使用,對與擴充是開放的,我們可以另寫一個介面的實現來擴充當前程式,而不影響上層的使用,但對修改是封閉的,即我們不能夠再去修改介面的定義,當然這個“不能夠”是指在規範原則上不應該這麼做!
2.抽象類別和介面的區別
答:
抽象類別(abstract class)可以包含功能定義和實現,介面(interface)只能包含功能定義
抽象類別是從一系列相關對象中抽象出來的概念, 因此反映的是事物的內部共性;介面是為了滿足外部調用而定義的一個功能約定, 因此反映的是事物的外部特性
分析對象,提煉內部共性形成抽象類別,用以表示對象本質,即“是什麼”
為外部提供調用或功能需要擴充時優先使用介面
3. C#語言中,實值型別和參考型別有何不同?
解答
實值型別和參考型別的區別在於,實值型別的變數直接存放實際的資料,而參考型別的變數存放的則是資料的地址,即對象的引用。
實值型別變數直接把變數的值儲存在堆棧中,參考型別的變數把實際資料的地址儲存在堆棧中,而實際資料則儲存在堆中。注意,堆和堆棧是兩個不同的概念,在記憶體中的儲存位置也不相同,堆一般用於儲存可變長度的資料,如字串類型;而堆棧則用於儲存固定長度的資料,如整數型別的資料int(每個int變數佔用四個位元組)。由資料存放區的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆棧中儲存兩個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆棧中儲存對同一個堆位置的兩個引用,即在堆棧中儲存的是同一個堆的地址。在進行資料操作時,對於實值型別,由於每個變數都有自己的值,因此對一個變數的操作不會影響到其它變數;對於參考型別的變數,對一個變數的資料進行操作就是對這個變數在堆中的資料進行操作,如果兩個參考型別的變數引用同一個對象,實際含義就是它們在堆棧中儲存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個對象的另一個變數。
4.結構和類的區別
解答
1) 結構是一個實值型別,儲存在棧上,而類是一個參考型別,儲存在受管制的堆上。
2) 對結構中的資料進行操作比對類或對象中的資料進行操作速度要快。
3) 一般用結構儲存多種類型的資料,當建立一個很多類或對象共用的小型對象時,使用結構效率更高。
4.抽象方法和虛方法的區別
抽象方法
使用abstract關鍵字 public abstract bool Withdraw(…);
抽象方法是必須被衍生類別覆寫的方法。
抽象方法是可以看成是沒有實現體的虛方法
如果類中包含抽象方法,那麼類就必須定義為抽象類別,不論是否還包含其它一般方法
虛方法
使用virtual關鍵字 public virtual bool Withdraw(…);
調用虛方法,運行時將確定調用對象是什麼類的執行個體,並調用適當的覆寫的方法。
虛方法可以有實現體
---------------------------------------------------------------------------------------------
虛擬方法和抽象方法有什麼區別?
抽象方法只有聲明沒有實現,需要在子類中實現;虛擬方法有聲明和實現,並且可以在子類中覆蓋,也可以不覆蓋使用父類的預設實現
虛擬方法有實現代碼
抽象方法則沒有,
並且抽象類別不能被執行個體化,只能執行個體化實現了全部抽象方法的衍生類別
抽象方法是虛擬方法的一種
抽象方法沒有實現,它的存在只是為衍生類別統一介面;衍生類別應該實現這個方法
如果編寫一個基類,它永遠不會被實現,那麼就應該將這個類中的一個或多個方法定義為
抽象方法。
抽象方法只有聲明沒有實現,需要在子類中實現;虛擬方法有聲明和實現,並且可以在子類中覆蓋,也可以不覆蓋使用父類的預設實現
補充一點
只允許在抽象類別中使用抽象方法聲明
學習
其實大家首先要搞清楚,虛方法與多態性關係密切,虛方法允許衍生類別完全或部分重寫該類的方法,需寫方法體。抽象類別中可以包含抽象方法與一般的方法,抽象類別不可以new,抽象方法只是一個定義,沒有方法體,也就是沒有{},也不要在裡面寫內容。它們兩個相像的一點是都用override重寫
1.C#類和介面的區別
介面是負責功能的定義,項目中通過介面來規範類,操作類以及抽象類別的概念!
而類是負責功能的具體實現!
在類中也有抽象類別的定義,抽象類別與介面的區別在於:
抽象類別是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。
但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面
PS:介面除了規範一個行為之外,在具體項目中的實際作用也是十分重要的,在物件導向的設計原則以及設計模式的使用中,無不體現作為一個介面的使用好處,最直接的就是設計原則中OCP(開放封閉原則),我們使用介面,而不需要關心他的具體實現,具體實現的細節變化也無關用戶端(使用介面的類)的使用,對與擴充是開放的,我們可以另寫一個介面的實現來擴充當前程式,而不影響上層的使用,但對修改是封閉的,即我們不能夠再去修改介面的定義,當然這個“不能夠”是指在規範原則上不應該這麼做!
2.抽象類別和介面的區別
答:
抽象類別(abstract class)可以包含功能定義和實現,介面(interface)只能包含功能定義
抽象類別是從一系列相關對象中抽象出來的概念, 因此反映的是事物的內部共性;介面是為了滿足外部調用而定義的一個功能約定, 因此反映的是事物的外部特性
分析對象,提煉內部共性形成抽象類別,用以表示對象本質,即“是什麼”
為外部提供調用或功能需要擴充時優先使用介面
3. C#語言中,實值型別和參考型別有何不同?
解答
實值型別和參考型別的區別在於,實值型別的變數直接存放實際的資料,而參考型別的變數存放的則是資料的地址,即對象的引用。
實值型別變數直接把變數的值儲存在堆棧中,參考型別的變數把實際資料的地址儲存在堆棧中,而實際資料則儲存在堆中。注意,堆和堆棧是兩個不同的概念,在記憶體中的儲存位置也不相同,堆一般用於儲存可變長度的資料,如字串類型;而堆棧則用於儲存固定長度的資料,如整數型別的資料int(每個int變數佔用四個位元組)。由資料存放區的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆棧中儲存兩個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆棧中儲存對同一個堆位置的兩個引用,即在堆棧中儲存的是同一個堆的地址。在進行資料操作時,對於實值型別,由於每個變數都有自己的值,因此對一個變數的操作不會影響到其它變數;對於參考型別的變數,對一個變數的資料進行操作就是對這個變數在堆中的資料進行操作,如果兩個參考型別的變數引用同一個對象,實際含義就是它們在堆棧中儲存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個對象的另一個變數。
4.結構和類的區別
解答
1) 結構是一個實值型別,儲存在棧上,而類是一個參考型別,儲存在受管制的堆上。
2) 對結構中的資料進行操作比對類或對象中的資料進行操作速度要快。
3) 一般用結構儲存多種類型的資料,當建立一個很多類或對象共用的小型對象時,使用結構效率更高。
4.抽象方法和虛方法的區別
抽象方法
使用abstract關鍵字 public abstract bool Withdraw(…);
抽象方法是必須被衍生類別覆寫的方法。
抽象方法是可以看成是沒有實現體的虛方法
如果類中包含抽象方法,那麼類就必須定義為抽象類別,不論是否還包含其它一般方法
虛方法
使用virtual關鍵字 public virtual bool Withdraw(…);
調用虛方法,運行時將確定調用對象是什麼類的執行個體,並調用適當的覆寫的方法。
虛方法可以有實現體
---------------------------------------------------------------------------------------------
虛擬方法和抽象方法有什麼區別?
抽象方法只有聲明沒有實現,需要在子類中實現;虛擬方法有聲明和實現,並且可以在子類中覆蓋,也可以不覆蓋使用父類的預設實現
虛擬方法有實現代碼
抽象方法則沒有,
並且抽象類別不能被執行個體化,只能執行個體化實現了全部抽象方法的衍生類別
抽象方法是虛擬方法的一種
抽象方法沒有實現,它的存在只是為衍生類別統一介面;衍生類別應該實現這個方法
如果編寫一個基類,它永遠不會被實現,那麼就應該將這個類中的一個或多個方法定義為
抽象方法。
抽象方法只有聲明沒有實現,需要在子類中實現;虛擬方法有聲明和實現,並且可以在子類中覆蓋,也可以不覆蓋使用父類的預設實現
補充一點
只允許在抽象類別中使用抽象方法聲明
學習
其實大家首先要搞清楚,虛方法與多態性關係密切,虛方法允許衍生類別完全或部分重寫該類的方法,需寫方法體。抽象類別中可以包含抽象方法與一般的方法,抽象類別不可以new,抽象方法只是一個定義,沒有方法體,也就是沒有{},也不要在裡面寫內容。它們兩個相像的一點是都用override重寫