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; } } } }