曾英-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; }//只读的属性
}
}