曾英-C#教學-40 向下轉換 as 定義接口安全
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_向上類型轉換 { class Program { static void Main(string[] args) { B b = new B(); //這裏通過轉換之後並非徹底的類型轉換 //這個步驟不能少 A a = b;//基類=派生類,這裏派生類b賦值給基類a這裏是向下類型的轉換 //這裏的a還不是徹底的轉化成b類,但能夠用b類中的虛方法 a.word();//這裏的a類已是繼承b類的了 //輸出結果:B1,調用的是b類中的虛方法 /*--------------------------------------------------------------------*/ if (a is B)//這裏並無徹底相等,可是這裏是返回的true { B b1 = (B)a; //強制轉換a,將具備基類與派生類屬的a徹底轉化換成B類 b1.wordB();//通過強制類型轉換後的b1就能夠調用B類中的方法了. } } } class A { public void wordA() { Console.WriteLine("A");} //基類虛方法 public virtual void word() { Console.WriteLine("A1"); } } //繼承 class B : A { //定義了與類名相同的方法 public void wordB() { Console.WriteLine("B"); } //重寫word虛方法,本身也是虛方法 public override void word() { Console.WriteLine("B1"); } } } //輸出:B1
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_向上類型轉換 { class Program { static void Main(string[] args) { B b = new B(); A a = b; B b1 = a as B;//a轉化爲B類的對象 //這是一個安全的轉化 //這裏若是不能轉化,則返回值是空,若是能轉化,則b1=a=new B(); if (b1 != null) b1.wordB(); //輸出結果:B } } class A { public void wordA() { Console.WriteLine("A");} //基類虛方法 public virtual void word() { Console.WriteLine("A1"); } } //繼承 class B : A { //定義了與類名相同的方法 public void wordB() { Console.WriteLine("B"); } //重寫word虛方法,本身也是虛方法 public override void word() { Console.WriteLine("B1"); } } }
程序實例:ide
主函數: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_接口 { class Program { static void Main(string[] args) { //前面用到類,後面用到類的構造函數 //一個接口,多個方法的實現.多態的實現. IBankeAccount myAccount = new SaverAccount(); //接口的對象能夠調用類中的普通方法,不須要強制轉換. myAccount.PayIn(1000); //取錢 myAccount.WithShowMyself(200); Console.WriteLine("餘額:" + myAccount.Balance); } } //銀行帳戶類 //這裏要繼承接口 //這裏要使用並重寫接口 class SaverAccount : IBankeAccount { private decimal balance; //存錢方法的重寫 public void PayIn(decimal amount) {balance += amount;} //取錢的方法重寫 public bool WithShowMyself(decimal amount) { //設立安全點 if (balance >= amount) { balance -= amount; return true; } else { Console.WriteLine("餘額不足"); return false; } } //顯示餘額的屬性重寫 public decimal Balance { get { return balance;} } } } 接口定義: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _40_接口 { interface IBankeAccount { //存錢,接口中的方法沒有用到public,可是永遠都是公用的. void PayIn(decimal amount); //取錢,也沒有用到方法體 bool WithShowMyself(decimal amount); //餘額 decimal Balance { get; }//只讀的屬性 } }