子類可以賦值給父類。(如果有乙個地方需要乙個父類作為引數,我們可以給乙個子類 )
如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
建立幾個類幫助我們理解:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 高山黎克特制轉換
}///
/// 父類
///public
class person
}///
/// 學生類繼承 person
///public
class student : person
}///
/// 老師類繼承 person
///public
class teacher : person}}
1.子類可以賦值給父類
在測試類中輸入:
// 子類可以賦值給父類:如果有乙個地方需要乙個父類作為引數,我們可以給乙個子類代替
// 建立乙個子類物件
//student s = new student();
// 記憶體中就是把父類的引用 指向了 子類的物件。
//person p = s;
// 簡寫
person p = new student();
目的:如果有乙個地方是乙個父類作為引數,我們可以給乙個子類代替就是因為子類可以賦值給父類。
例如:
join();表示把指定的分隔符放到乙個陣列裡面去。
可以看出join(string separator,params object values);第二個引數是object型別的陣列,而object是一切型別的 父類。
string.join("|", new
string );
我們在這裡建立的是string陣列的物件,而這個陣列屬於object的子類。在這裡正好充分說明了子類可以賦值給父類。可以輸出檢視:
2.如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
在測試類中輸入:
// 如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
// 強轉
student ss = (student)p;
ss.studentsayhello();
console.readkey();
執行結果:
說明強轉成功。再將上面這段**改為:
teacher ss = (teacher)p;
ss.teachersayhello();
console.readkey();
執行結果:
這裡就會發生異常,強轉失敗,在上面**person p = new student();父類中裝的是student。這兩個強轉充分說明了如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
那麼還有乙個問題,在黎克特制強轉時經常會拋異常,所以在我們黎克特制強轉時經常使用is和as型別轉換。
將**改為一下:
//
is 表示 將 p 轉換為 teacher,如果能夠轉換將在這裡返回 true,否則為 false
if (p is teacher)
else
執行結果:
可以將上面**改為:
if (p is student)
else
執行結果:
將上面**注釋掉,寫入下面**:
// as 表示如果 p 能夠轉換 teacher 返回 teacher 物件,否則返回乙個 null 。
teacher t = p as teacher;
我們打個斷點可以看出:
返回了乙個 null。換成:
C 基礎概念 黎克特制轉換 as is
子類可以賦值給父類。如果有乙個地方需要乙個父類作為引數,我們可以給乙個子類 如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。using system using system.collections.generic using system.linq using system.text ...
C 基礎知識點
1.單行注釋 多用於給變數注釋 2.多行注釋 多用於大段文字注釋 3.文件注釋 多用於給類和方法注釋 只能以字母 或者 符號開頭。開頭暫時不要用,它們有自己特殊的意義 後面可以跟任意的字母數字下劃線 命名法 1 camelclass駝峰命名法 變數名首單詞的首字母小寫,其餘的每個單詞的首字母大寫eg...
C 基礎知識點
主要包含c 常用語句 語言特徵 物件導向程式設計基礎 集合和索引。c 常用語句 物件導向程式設計基礎 高階程式設計 多重介面實現,c 不允許多重類繼承,但c 允許多重介面實現,定義時基類必須在介面之前,如 public class mobile phone,iusb,ibluetooth publi...