class Program
{
static void Main(string[] args)
{
Student b = new Student();
(Person)b.work(); //这样写,为什么要不得
Console.ReadKey();
}
}
class Person
{
public virtual void work()
{
Console.WriteLine("我正在工作");
}
}
class Student : Person
{
public override void work()
{
Console.WriteLine("我正在认真学习");
}
}
上述代码为什么会报错呢?
本人到处查询一直没弄懂父类与子类的相互强制转换的资料,百度里面也没几个说清楚,请教一下:
父类与子类的强制转换的知识,谢谢!!!
{
static void Main(string[] args)
{
Student b = new Student();
(Person)b.work(); //这样写,为什么要不得
Console.ReadKey();
}
}
class Person
{
public virtual void work()
{
Console.WriteLine("我正在工作");
}
}
class Student : Person
{
public override void work()
{
Console.WriteLine("我正在认真学习");
}
}
上述代码为什么会报错呢?
本人到处查询一直没弄懂父类与子类的相互强制转换的资料,百度里面也没几个说清楚,请教一下:
父类与子类的强制转换的知识,谢谢!!!
b.work是方法,而Person是个类
能转换吗
如果你想看结果
这样做 ((Person)stu).work();
此时的结果是“我正在认真学习”
因为调用的还是Student的work方法
它已经把Person里的重写 !
((Person)s).work();不是不能转换
Person per = new Person();
((Student)per).work();
就会出错
这样想下
(人类)学生 可以
(学生)人类 就有问题了
{
static void Main(string[] args)
{
Student b = new Person();//请看清父类和子类的关系
(Person)b.work();
Console.ReadKey();
}
}
class Person
{
public virtual void work()
{
Console.WriteLine("我正在工作");
}
}
class Student : Person
{
public override void work()
{
Console.WriteLine("我正在认真学习");
}
}
class Program
{
static void Main(string[] args)
{
Person stu = new GoodStudent();
stu.work();
((Student)stu).work(); //把stu转换成了Student
((GoodStudent)stu).work(); //把stu转换成了GoodStudent
Console.ReadKey();
}
}
class Person
{
public virtual void work()
{
Console.WriteLine("我正在工作");
}
}
class Student : Person
{
public new void work()
{
Console.WriteLine("我正在认真学习");
}
}
class GoodStudent : Student
{
public new void work()
{
Console.WriteLine("我都学会了,玩呢");
}
}
第二段代码:
class Program
{
static void Main(string[] args)
{
GoodStudent stu = new GoodStudent();
((Person)stu).work();
((Student)stu).work();
((GoodStudent)stu).work();
Console.ReadKey();
}
}
class Person
{
public virtual void work()
{
Console.WriteLine("我正在工作");
}
}
class Student : Person
{
public new void work()
{
Console.WriteLine("我正在认真学习");
}
}
class GoodStudent : Student
{
public new void work()
{
Console.WriteLine("我都学会了,玩呢");
}
}两段代码一对比,就迷糊了,(类名)对象名...括号内的级别到底比对象高还是低啊,上面的例子,两种情况都有
编译不通过!
stu.work();
stu是Person的实例
((Student)stu).work();调用Student
((GoodStudent)stu).work();调用GoodStudent
GoodStudent stu = new GoodStudent();声明的是GoodStudent
((Person)stu).work();类型转换为Person,调用Person
((Student)stu).work();类型转换为Student,调用Student
((GoodStudent)stu).work();类型转换为GoodStudent,调用GoodStudent
{
public A() { }
}public class B : A
{
public B() { }
}类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为
子类可以转换为父类 (father)child Right
父类不可以转换为子类 (child)father wrong
子类当然能赋值给父类
在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单的说,子类型必须能够替换掉它们的父类型。
Object是内存中的类型是不变的
可以将子类型的object赋给父类型的变量,使用父类型的引用的时候无法访问子类型的成员
Base a = new SubClass();
然后可以使用赋值语句和强制类型转换将父类型变量赋给子类型变量。
SubClass b = (SubClass)a;