对象的引用可以被:
隐式地向上转换
显示的向下转换
向上转换
向上转换是指一个从一个基类指向一个子类:
House house = new House();
Asset asset = house;
House
类是Asset
的子类
这个时候隐式的向上转换就发生了
Asset
类的一个对象asset
指向了它的子类House
的对象house
Console.WriteLine(asset == house); // True
由于两个对象指向同一个类House
所以他们是相等的。
对于asset来说访问到house的Name属性是非常简单的
但是就没法访问到Mortgage这个属性就没那么容易了,因为Mortgage中指存在了Name
并不存在Mortgage
这个属性
向下类型转换
向下类型转换是指一个子类的对象指向其基类
House h = new House();
Asset asset = h;
House house = (House)asset;
- 父类比子类牛逼
- 父类可以随意引用子类 向上转换
- 但是子类引用父类需要显示转换 向下转换
向下转换需要显示说明,因为可能存在问题
Stock stock = new Stock();
Asset asset = stock;
House house = (House)asset;
编译时会报错,asset不是House类型所以无法强制转换为House类型
as运算符
as运算符在向下转换时尝试把基类的对象转换成子类的对象,若转换发生错误时,就会赋值null
Stock stock = new Stock();
Asset asset = stock;
House house = asset as House;
if (house != null)
{
Console.WriteLine(house.Mortgage);
}
输出为空,说明house的值为null
is运算符
is运算符用来检测引用的转换是否能够成功,换句话来说,就是检测一个对象是否从某个特定类派生。
static void Main(string[] args)
{
House mfHouse = new House(){Name = "Nva"};
Asset asset = mfHouse;
if (asset is House)
{
Console.WriteLine(((House)asset).Name);
}
}