40-向下转换 as 定义接口

Posted 泮聪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了40-向下转换 as 定义接口相关的知识,希望对你有一定的参考价值。

曾英-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 定义接口的主要内容,如果未能解决你的问题,请参考以下文章

Is 运算符使用,以及as运算符向下类型转换

使用接口包装库而不需要向下转换

sql里面 with...as 是啥意思啊?如何使用

向下转换“任何”时出现 Swift 错误

向下转换接口参考

TypeScript 接口向下转换