黑马程序员技术交流社区
标题:
里氏替换
[打印本页]
作者:
边亮
时间:
2013-3-12 23:45
标题:
里氏替换
父类:Person
子类:student
person per=new student();
子类可以赋值给父类;
如果父类中存储的是子类的对象,那么这个父类可以强制转换成子类;
这个要怎么理解;
说下里氏转换的转法跟作用;
作者:
天行
时间:
2013-3-13 15:11
1、原则上是子类对象是可以赋值给父类对象的,即子类可以完全替换父类出现的地方,但是反过来父类对象不是替换子类对象的。我们把这种特性叫做里氏替换原则(LSP)
2、里氏替换原则有两个关键字:is和as
eg: is是用来检测对象是否与给定对象类型的兼容
class Program
{
static void Main(string[] args)
{
int i=3;
string str="Hello World";
if (i is string)
{
Console.WriteLine("是给定的类型");
}
else
{
Console.Write("不是给定的类型");
}
}
eg: as操作符类似于强制类型转换,但是转换失败的话不会报错,只会返回一个null值
class Program
{
static void Main(string[] args)
{
string str="Hello World";
object s = str as object;
if (s != null)
{
Console.WriteLine("转换成功!!!");
Console.WriteLine(s.ToString());
}
else
{
Console.WriteLine("转换失败");
}
}
作者:
宋健
时间:
2013-3-13 17:58
第一个问题:里氏替换的解释:
里氏替换说的是父类引用指向子类实例;整个过程是这样的:
①new Student(),在堆上开辟一块空间存储student类型的对象;
②在栈上分配一块Person类的内存地址per;
③让per指向堆上的对象;
就这样实现了父类引用指向子类实例。
第二个问题:父类强转为子类
如果父类中存储子类的对象,即父类引用指向子类实例,因为子类继承了父类公开的属性和方法,
父类强制转换为子类,数据不会丢失;
相反,假设一种不可能发生的情形
如果是子类引用指向父类实例,将子类强制转换为父类,子类自己声明的属性和方法将会丢失。
以上,请参考。
作者:
曾玉锋
时间:
2013-3-13 18:29
本帖最后由 曾玉锋 于 2013-3-13 18:30 编辑
file:///C:/.../Administrator/桌面/未命名.jpg
Person per=new Student();//per 指向 new Student() 这个对象,取名为S1
Student stu=(Student)per;//stu 也指向 new Student() 这个对象 S1
其实,per 和stu是对同一个对象的引用,所以可以进行互相转换。
里氏转换原则的好处:实现多态。
多态的表现形式是父类对象.父类的方法 而表现出子类对象的具体行为,父类对象引用不同的子类对象,也就表现出不同的行为。
所以,通常用父类对象作为方法的参数,使用的时候传递不同子类的对象,就会表现出不同的行为特征。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2