> 用父類的對象來調用子類的方法
> 對繼承來說,是在子類中定義方法,調用父類中的屬性。
多態:在父類中定義方法,然后在子類中創建對象來調用。
比如父類中有:
屬性:體重
行為:叫
子類中有貓、狗、羊。
那么在父類中創建對象時,就可以調用貓、狗、羊這三個子類來實現“叫”這個行為。
> 也就是:以父類的身份出現,但以子類的方式工作。
# 虛方法
多態使得派生類(子類)的實例可以直接賦值基類的對象,然后直接通過這個對象調用派生類的方法。
c#中類的多態性是通過在派生類(子類)中寫**基類**的虛方法來實現。
也就是:
```
子類(實例)=> (虛方法)= > 父類(對象)=> 子類方法
```
在父類中用`virtual`來寫需方法,在子類中用`override`來重寫虛方法。
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多態
{
class Vehicle //定義父類名叫Vehicl
{
public string Name { get; set; } //定義屬性。但其實如果不定義為屬性,也是可以的,也可以直接定義為變量:public string Name; 也是可以的
public virtual void Move() // 用virtual來表示虛方法
{
Console.WriteLine("{0}可以移動", Name);
}
}
class Train:Vehicle //定義子類 火車
{
public override void Move() // 用override來重寫虛方法
{
Console.WriteLine("{0}可以在鐵軌上行駛", Name); //把默認的base方法替換掉
}
}
class Car:Vehicle // 定義子類 汽車
{
public override void Move()
{
Console.WriteLine("{0}可以在道路上行駛", Name);
}
}
class Program
{
static void Main(string[] args) // 在Main()中創建對象
{
Vehicle v = new Vehicle(); // 先創建父類對象
Train t = new Train();//創建子類對象
Car c = new Car(); // 創建子類對象
Vehicle[] vs = { v, t, c }; // 創建父類的對象數組并賦值,這個集合名叫vs。
v.Name = "交通工具";
t.Name = "火車";
c.Name = "汽車";
vs[0].Move(); //第一個元素是 v,在基類中,所以默認調用基類方法
vs[1].Move(); //第二個元素是t,在派生類中,所以會自動調用派生類 Train 中的方法
vs[2].Move(); //第三個元素是c,在派生類中,所以會自動調用派生類Car中的方法
Console.Read();
}
}
}
```
# 抽象類和抽象方法
接上述多態。
可在父類中定義抽象方法`abstract class Vehicle`,也就是沒有中括號以及括號內的內容,然后在子類中重寫override 。
但要注意,此時如果在Program 中創建對象,那么抽象方法無法創建對象,這時候要通過將其具體化到子類中去實現。


```
namespace 多態
{
abstract class Vehicle //abstract寫前面,此時這個類也是抽象的
{
public string Name { get; set; }
public abstract void Move(); // abstract 為抽象方法,無需中括號以及其內部的內容。
}
class Train:Vehicle
{
public override void Move() // 用override來重寫虛方法
{
Console.WriteLine("{0}可以在鐵軌上行駛", Name);
}
}
class Car:Vehicle
{
public override void Move()
{
Console.WriteLine("{0}可以在道路上行駛", Name);
}
}
class Program
{
static void Main(string[] args) // 在Main()中創建對象
{
Train t = new Train();
Car c = new Car();
Vehicle v = new Train(); //此時創建父類對象時,要直接用子類的屬性。
v.Name = "火車";
v.Move();
Console.Read(); //輸出的結果為“火車在軌道上行駛”
}
}
}
```
# 接口
關鍵字:`interface`
實現:通過類 繼承接口 來實現。
比如:定義2 個接口(名叫Information、Information2)
```
interface Information
{
string Code{get; set;}
string Name{get; set;}
void ShowInfo(); //不允許寫修飾符 public
}
interface Information2
{
string Code{get; set;}
void ShowInfo();
}
```
實現:通過類來實現
```
public class JHInfo: Information, Information2 // 繼承接口的列表
{
string code = "";
string Name = "";
public string Code //定義屬性
{
get { return code;}
set { code = value;}
}
public void ShowInfo()
{
console.writeline(Code + Name);
}
}
```
> 報錯:C#運行提示錯誤不實現接口成員
意思是:在接口中定義的所有元素,在后續要實現的類中,一旦繼承了,就必須全部再體現一遍。例如上述接口中定義了兩個屬性以及一個方法,那么在后續的實現類中,也必須定義兩個屬性以及一個方法。
- 幫助文檔 microsoft helo viewer
- c#開發環境及visual studio安裝注意事項
- c#程序基本結構-基本語法
- Q1: public static void main(String[] args) 是什么意思
- Q2: c#命名空間+Main方法
- Q3:注釋+命名規則+代碼規則
- Q4: c#語句 system => console
- Q5: 數據類型 .net
- Q5: 常用名字、變量、運算符
- Q6: 對話窗輸入-屬性
- Q7: 遞歸
- Q8:決策分支、條件判斷語句 if 語句
- Q9:數組
- Q10:字符串
- Q11:對象、類、訪問權限、靜態動態函數
- Q12:方法及參數——繼承于類
- Q13:構造函數
- Q14:繼承——base 關鍵字
- Q15:多態、虛方法、接口
- Q16:創建窗體應用、控件
- Q17:Ado數據訪問、連接 sqlserver 數據庫
- Q18: 讀取數據command + DataRead( )、DataSet + DateAdapter
- Q19: Entity Framwork、entity 與 ADO.net的區別
- Q20: 對話框、文件、文件夾
- Q21: 導入excel數據、更新到 dbo 數據庫中
- Q26: 獲取 excel 中每個 sheet 的表名
- Q22: 兩個窗體之間數據+方法傳遞
- Q23: 數學對象
- Q24: c#網站編寫
- Q25: visual studio2017如何查看幫助
- Q27: c# dictionary 字典對象
- Q28: 數組與dataTable互相轉化