1. 程式人生 > >40-向下轉換 as 定義接口

40-向下轉換 as 定義接口

多態 實現 ide sel brush 強制類型轉換 掌握 都是 ride

曾英-C#教學-40 向下轉換 as 定義接口

目錄

  • 掌握基類轉換為派生類向下類型的轉換
  • 掌握as運算符的用法
  • 如何定義和使用接口

1/向下類型轉換

  • 派生類轉換為基類即向上類型的轉換
  • 基類轉換為派生類即向下類型的轉換
  • 普通方法與虛方法的區別就是兩者在繼承中實現的區別.
    • 普通方法在繼承中無法繼承調用
    • 繼承方法這可以繼承調用
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

  

2/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 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"); }
        }
    }

  

3/接口

  • 接口是為大家制定了一個規範.

3.1 接口的定義

  • 命名的時候首字母要用大寫的I.
  • 接口在添加新項中添加一個新的接口文檔
  • 接口在定義的時候沒有方法體,只有方法的名稱
  • 方法定義的都是公用的屬性或者方法

程序實例:

主函數:
    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; }//只讀的屬性
        }
    }

  

40-向下轉換 as 定義接口