C#(二十三)之C#中的is运算符

简介: 本篇内容记录了is运算符、向下转换、as运算符、接口interface的基本用法。

QQ图片20220426142952.jpg

1:is运算符:


is运算符用来判断对象是不是某种类型


/* C#主要的运行函数,就是main函数 */
        static void Main(string[] args)
        {
            // is运算符
            double x = 100;
            Console.WriteLine(x is double);
            // 输出:True
        }

 

2:向下转换


基类转换为派生类:向下转换


派生类转换为基类:向上转换(这个在C#中没有必要)


/* C#主要的运行函数,就是main函数 */
        static void Main(string[] args)
        {
            // 向下类型装换
            B b = new B();
            A a = b;
        }
        class A {
            public void wordA()
            {
                Console.WriteLine("我是A");
            }
            public virtual void AA()
            {
                Console.WriteLine("我是AA");
            }
        }
        class B : A {
            public void wordB()
            {
                Console.WriteLine("我是B");
            }
            public override void AA()
            {
                Console.WriteLine("我是重写AA");
            }
        }


以上代码就实现了C#中的向下转换。


那么这是否就意味着,a类转化为b类的时候就可以直接使用b类中的方法呢?答案是不行。


普通方法不具有多态性,虚方法具有多态性。


那如果我们执行普通方法怎么办呢?两次握手强制转换


static void Main(string[] args)
        {
            // is运算符
            double x = 100;
            Console.WriteLine(x is double);
            // 输出:True
            // 向下类型装换
            B b = new B();
            A a = b;// 此时a并不是完全的B类对象
            // a.wordB();报错:普通方法不具有多态性
            a.AA();//可执行成功,虚方法具有多态性
            // 使用is运算符判断 a 的属性
            Console.WriteLine(a is B);
            if(a is B)
            {
                // 将具有不完全B属性的a对象强制转换为B对象
                B aa = (B)a;
                aa.wordB();  // 可运行成功
            }
        }

 

3:as运算符


上边的程序使用is运算符,这是没有问题的,但是麻烦了点,我们可以使用as运算符尝试下。


static void Main(string[] args)
        {
            // is运算符
            double x = 100;
            Console.WriteLine(x is double);
            // 输出:True
            // 向下类型装换
            B b = new B();
            A a = b;// 此时a并不是完全的B类对象
            // a.wordB();报错:普通方法不具有多态性
            a.AA();//可执行成功,虚方法具有多态性
            B aab = a as B; // 将a转换为B类的对象
            // 转换成功就是 new B  转换不成功就是null
            if(aab != null){
                aab.wordB();
            }
        }

 

4:接口interface


定义接口命名基本上以大写的 ‘I’ 开头,当然这个不是一定的。只是一种个人习惯。


创建接口流程


(1):单机项目菜单,选择添加新项。


(2):选择接口,输入文件名,点击创建。

 

C#中的接口定义不需要使用修饰词(public  private  protected);

但是其默认是public,不用写。

 

接口的对象可以调用类中的方法而无需强制转换。这是重点


接口类:InterfaceGc.cs


interface InterfaceGc
    {
        // 存款
        void PayIn(decimal amount);
        // 取款
        bool QuKuan(decimal amount);
        // 余额(只读)
        decimal Sheng{
            get;
        }
    }

 

InterfaceNew.cs


// 定义一个转账接口
    interface InterfaceNew : InterfaceGc
    {
        // 定义一个接口方法
        bool TranceTo(InterfaceGc destination,decimal amount);
    }

 

继承接口类:


// 建立一个银行账户类继承接口类
        class Bank : InterfaceGc {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get{
                    return blanace;
                }
            }
        }
// 定义一个转账的接口
        class Inter : InterfaceNew
        {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get
                {
                    return blanace;
                }
            }
            // 转账接口
            public bool TranceTo(InterfaceGc obj, decimal amount)
            {
                bool result = QuKuan(amount);
                if (result == true)
                {
                    obj.PayIn(amount);
                }
                return result;
            }
        }
    }

 

调用:接口


接口的对象可以调用类中的方法而无需强制转换。这是重点


static void Main(string[] args)
        {
            // 调用继承接口的类(注意这个写法---多态)
            // 接口的对象可以调用类中的普通方法
            InterfaceGc myAccount = new Bank();
            InterfaceNew youAccount = new Inter();
            //我先存钱
            myAccount.PayIn(1000);
            //我再取钱
            myAccount.QuKuan(1200);
            // 你先存钱
            youAccount.PayIn(5000);
            // 你给我转账
            youAccount.TranceTo(myAccount, 500);
            // 查看我的余额
            decimal myYue;
            myYue = myAccount.Sheng;
            Console.WriteLine("我的余额:"+myYue);
            //查看你的余额
            decimal youYue;
            youYue = youAccount.Sheng;
            Console.WriteLine("你的余额:"+youYue);
        }

 

测试使用全部代码:


接口文件:InterfaceGc.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gc
{
    interface InterfaceGc
    {
        // 存款
        void PayIn(decimal amount);
        // 取款
        bool QuKuan(decimal amount);
        // 余额(只读)
        decimal Sheng{
            get;
        }
    }
}

 

InterfaceNew.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gc
{
    // 定义一个转账接口
    interface InterfaceNew : InterfaceGc
    {
        // 定义一个接口方法
        bool TranceTo(InterfaceGc destination,decimal amount);
    }
}

 

主文件:program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gc
{
    class Program
    {
        static void Main(string[] args)
        {
            // 调用继承接口的类(注意这个写法---多态)
            // 接口的对象可以调用类中的普通方法
            InterfaceGc myAccount = new Bank();
            InterfaceNew youAccount = new Inter();
           //我先存钱
            myAccount.PayIn(1000);
            //我再取钱
            myAccount.QuKuan(1200);
            // 你先存钱
            youAccount.PayIn(5000);
            // 你给我转账
            youAccount.TranceTo(myAccount, 500);
            // 查看我的余额
            decimal myYue;
            myYue = myAccount.Sheng;
            Console.WriteLine("我的余额:"+myYue);
            //查看你的余额
            decimal youYue;
            youYue = youAccount.Sheng;
            Console.WriteLine("你的余额:"+youYue);
        }
        // 建立一个银行账户类继承接口类
        class Bank : InterfaceGc {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get{
                    return blanace;
                }
            }
        }
        // 定义一个转账的接口
        class Inter : InterfaceNew
        {
            // 定义一个余额
            private decimal blanace;
            // 重写接口中定义好的存钱类
            public void PayIn(decimal amount)
            {
                blanace += amount;
            }
            // 重写接口中定义好的取钱类
            public bool QuKuan(decimal amount)
            {
                // 判断余额是否大于要取得钱数
                if (blanace > amount)
                {
                    blanace -= amount;
                    return true;
                }
                else
                {
                    Console.WriteLine("余额不足,取款失败");
                    return false;
                }
            }
            // 重写余额接口
            public decimal Sheng
            {
                get
                {
                    return blanace;
                }
            }
            // 转账接口
            public bool TranceTo(InterfaceGc obj, decimal amount)
            {
                bool result = QuKuan(amount);
                if (result == true)
                {
                    obj.PayIn(amount);
                }
                return result;
            }
        }
    }
}



目录
相关文章
|
3月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
64 3
|
3月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
99 1
|
4月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
250 1
|
3月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
35 0
|
8月前
|
C# 数据库
C#中的空合并运算符与空合并赋值运算符:简化空值处理
C#中的空合并运算符与空合并赋值运算符:简化空值处理
|
9月前
|
开发框架 .NET 程序员
C#三元运算符使用技巧
C#三元运算符使用技巧
84 0
|
9月前
|
C# 数据安全/隐私保护
C#运算符
C#运算符
47 0
|
9月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
105 1
|
9月前
|
C# 图形学
【Unity 3D】C#控制语句break、continue及算数运算符和逻辑运算符的讲解(附测试代码)
【Unity 3D】C#控制语句break、continue及算数运算符和逻辑运算符的讲解(附测试代码)
79 1
|
9月前
|
存储 C#
C#入门开发(Hello World,运算符)
C#入门开发(Hello World,运算符)
73 0