C#中父类转换成子类之后为什么不具备子类的属性和方法了

笔者是新手,已经在学习面向对象了,可是有一个疑问一直想不通:根据里氏转换原则,父类对象如果里面存储的是一个子类对象,那么这个父类对象是能够强转成子类的。可是根据本人的理解,父类对象强转成子类之后应该就是一个子类对象吧,为什么不具备子类的属性和方法呢。
下面是具体案例:
比如我定义了一个父类对象Person:
Class Person
{
private string name; //定义person类的姓名字段和属性
public string Name
{
get{return name;}
set{name=value;}
}

private char sex; //定义Person类的性别字段和属性
public char Sex
{
get{return sex;}
set{sex=value;}
}

public void PersonSayHello()
{
Console.WriteLine("我是一个人类!");
}
}

然后我又定义了一个Person类的子类Student:
class Student:Person //继承于Person类
{
private int mathscore; //定义一个数学分数属性
public int MathScore
{
get{return mathscore;}
set{mathscore=value;}
}

public void StuSayHello()
{
Console.WriteLine("我是一个学生。");
}
}

然后我实际代码如下:
Person PER=new Student(); //创建一个Student对象,将其赋值给Person对象PER
Student STU=(Student)PER; //根据里氏转换原则,将PER对象转换成Student类型,并赋值给STU。

接下来就是问题了,我特意使用PER的GetType()方法试了转换之后PER确实是Student类型,但是我不能为PER的mathscore属性赋值,也不能调用PER作为一个Student对象的StuSayHello()方法,这是为什么呢。

0

6个回答

你好,Person PER=new Student();
Student STU=(Student)PER;
首先这是多态,这两段代码是没有问题的,但是PER.mathscore=5;Per.StuSayHello()是不合法的,因为mathscore和StuSayHello()是子类的扩展属性和方法,在父类里面没有,子类没有重写父类里面任何方法,Person PER=new Student();这段代码虽然是父类引用指向子类对象,但是只有子类重写了父类的方法后,Per.StuSayHello()这样调用才会执行子类重写后的StuSayHello()方法。总结一下:多态的弊端,不能使用子类提油的功能,因为子类特有方法不是重写的,如果在多态情况下想使用子类特有的方法,应该向下转型。至于为什么PER.mathscore=5;是错误的,是因为父类中没有这个属性,你使用父类引用去访问这个成员会显示找不到符号等错误。再总结一下:多态的前提:A:有继承 B:有实现 C:有方法重写 D:有父类引用指向子类对象。多态中成员访问特点:A:访问成员变量:编译看左边,运行看左边。
B:访问成员方法:编译看左边:运行看右边。(如果子类有方法重写,就使用子类重写过的方法;父类引用不能使用子类特有的方法)

1
qq_36442947
睡着了才觉得冷 特有,打错了
一年多之前 回复
qq_36442947
睡着了才觉得冷 补充一点:我说的重写父类里面的方法:”Per.StuSayHello()这样调用才会执行子类重写后的StuSayHello()方法。“,必须你现在这个Person类要有这个方法,实际上你可以重写PersonSayHello()
一年多之前 回复

Student STU=(Student)PER;
STU.xxx
只能这么调用
PER是基类类型,编译器只认类型,而不是实际的对象。
道理很简单,PER是一个变量,它可以是student类型,也可以不是,运行的时刻,它是什么类型,谁也不知道,编译器只能按照person对待。

1

PER 和 STU虽然指向的是同意对象,但是 PER会认为对象内容是一个Person ,所以只能调用Person类的方法

1

代码问题,代码如下:
Person PER=new Student();
Student *STU=(Student
)PER;
STU->StuSayHello();

0
xzs1994
xzs1994 new 对象返回的是指针
一年多之前 回复
l19920312
l19920312 PER 和 STU虽然指向的是同意对象,但是 PER会认为对象内容是一个Person ,所以只能调用Person类的方法这个说法是对的
一年多之前 回复
qq_39664442
qq_39664442 ddf
一年多之前 回复
qq_15643973
qq_15643973 回复qq_15643973: new 对象返回的是指针
一年多之前 回复
qq_15643973
qq_15643973 指针打不出来,什么鬼?
一年多之前 回复

new 对象返回的是指针

0

正常就是这样的,不然子类=父类,就没有区别了图片说明

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#中 父类调用子类的属性、方法
rn rn我们习惯认为,子类对父类是不可见的,或者说父类不知道子类的存在,所以父类是调用不到子类的方法、属性的,以下这种方式,可以实现父类调用子类属性、方法的功能,欢迎拍砖。。。rn rnpublic class WeChatBaseController  //父类rn{rnpublic WeChatBaseController()rn{rn}rnpublic string MyUserList ...
C# 里氏转换(父类转换成子类)( is as )
里氏转换:rn1、子类可以赋值给父类rn2、如果父类中装的是子类对象,则可以将这个父类转换为对应的子类对象rn---->关键字rn1、is:返回bool类型,指示是否可以做这个转换rn2、as:如果转换成功,则返回对象,否则返回nullrnrnrnusing System;nusing System.Collections.Generic;nusing System.Linq;nusing Sys
C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?
在子类中用override重写父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;n如果子类中用new覆盖父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚方法;
修改子类中继承自父类的属性的类型
在使用 UITableView 时,经常创建具体的模型来简化代码:nnclass Section: NSObject {nn var items: [Item]n n init(items: [Item]) {n self.items = itemsn }n}nnclass Item: NSObject {nn ...
c#中子类使用被隐藏的父类方法
nnc#中子类使用被隐藏的父类方法nn nn   在C#中,在子类中可用new修饰一个方法,实现了在子类中隐藏父类方法。但有时我们可能需要通过子类对象使用已被隐藏了的父类方法,这时可通过类转换来调用被隐藏了的方法,这样,子类对象既也可以使用自身新定义的方法,也可以使用已被隐藏的父类的方法。以是一个示例.nn nn class Program {n        static void Main...
父类中私有的成员 可以被继承 ,但是 子类无法 直接 获取 ,需要 父类 提供一个 方法 类获取 私有 属性 get\set 方法
父类中私有的成员可以被继承,但是子类无法直接获取,需要父类提供一个方法类获取私有属性get \ set方法1.列表内容nn父类 npublic class Role { n private String name; n private int blood; n private int level;nnpublic String getName() {n return nam...
C#中子类与父类的相互转换
1.父类不能直接强制转换成子类 n2.子类可以强制转换成父类,但是在父类中只能取父类的字段与方法因此在一个父类对应多个子类的时候,不知道具体是哪个子类的时候,就可以先声明一个父类的类型。(如例1) n3.由1,2知,父类不能直接强制转换成子类,但是可以通过间接的方法进行转换,例1中有所体现:将子类转换成父类,然后再把父类转换成子类,如例2。 n特别说明:虽然可以通过间接方式将父类转成子类,但实际用处
java子父类继承时方法重写与属性覆盖
java子父类继承时方法重写与属性覆盖
子类会继承父类的私有方法和私有属性,只是不能直接访问
假设父类有私有变量 int a 和公共方法 int getA(),方法中访问了变量 {return a;}。子类继承的方法在被调用时,需要传入子类对象引用,就是this,因为方法内部实际上是 {return this.a;}。方法是通过对象引用来获取变量,如果没有继承,那么子类的this里面就没有这个a了。同理,公共方法getA()内部可能调用父类的私有方法setFlag(),只是在子类内部,不能
(java)对象引用向上转型后,无法调用子类独有的方法和属性问题
在下面的代码中,即可验证这一点,class StaticTest1n{n private static int c=2017; public void print(){n System.out.println(c+" is a different year!");n }n}npublic class Statictest extends StaticTest1n{
为什么一个对象可以用父类或接口声明,却用子类实例化 C#
内容会持续更新,有错误的地方欢迎指正,谢谢!基本概念这个实例是子类的,但是因为你声明时是用父类声明的,所以你用正常的办法访问不到子类自己的成员,只能访问到从父类继承来的成员。在子类中用override重写父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;如果子类中用new覆盖父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚
子类与父类之间的转换
class A {n n public void fun1() {n System.out.println(" A fun1 is calling!!!");n }n n public void fun2() {n fun1(); n }n n}nnclass B extends A{n n public void fun1() {n System.out.println(" B fun1 ...
C#泛型类访问子类成员
要处理的问题是父类对象不能访问子类对象的字段。rnrnrn进入正题:rn有两个类,一个父类一个子类。解决的问题是要在实例化之后可以访问子类成员。rn父类:rnpublic class Studentn{n public string school;n}rn子类:rnpublic class College:Studentn{n public int age;n public Co
父类获取子类的新属性值
情景:在一个方法中class A {}nclass B extends A{n private String token;n public String getAgentToken() {n return token;n }n public void setAgentToken(String token) {
C#中继承实现父类方法、重写、重载
C#中子类重写父类方法的几种情况,关键字:virtual、abstract、override、new。(此处不说abstract,以后补充)n  virtual:不是必须被子类重写的方法,父类必须给出实现,子类可以重写(使用override,new,或无特殊标志的普通方法),也可以不重写该方法。n  new:重写父类方法时,父类可以使用virtual,override,new之一声明,也可以是
子类继承父类静态变量问题
java示例:npublic class Main7 extends Father{nn //static int test = 11; n public static void main(String[] args) {n test++;n Father father = new Father();n System.out.println(test);n }n}nnclass Fathe
OC----父类与子类同名属性
子类不能存在与父类同名的方法,属性nsuper 关键字:n1. 可以用在类方法,对象方法中, 同self, 继承用super 的可读性要好n2. 在对象方法中可以使用 super关键字调用当前对象从父类继承过来的对象方法.[self say] = [super say]n3. 在类方法中 super关键字可以调用当前类从父类继承过来的类方法na. 类方法也能被子类继承. 父类中的类方法可以使用父类...
子类继承父类的输出结果
public class A {n static{n System.out.println("static in class A");n }nn public A(){n System.out.println("class A");n }n}public class SubA extends A {n static {n Sy...
java中的父类和子类之间的转换规则和泛型的特点使用方法
java中的父类和子类之间的转换规则:rnrnrn子类转换成父类没有什么要求,直接赋值即可: eg: father f= new son()rnrnrn父类转换成子类的话需要使用强制转换 : eg: son s = (son) f ;rn子类继承父类的非私有的的方法和属性,子类可以覆写父类的方法,子类可以有自己的属性和方法,所以子类的实例是一个父类的实例,而父类的一个实例不一定是子类的实例。rn注意在进行父类转换...
对于父类的私有属性,子类是从哪里访问到的?
其实也是牵扯到子类继承父类时,父类的private属性在子类中是什么样的问题。rn根据JAVA官方的定义:rnA subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its
把父类list集合中元素放在子类list集合中
用子类list集合存储父类list集合中的元素,子类继承父类
java基础------>继承--->属性(在子类中调用父类同名属性的两种方式)
在今天的继承复习当中,我有对继承中的属性有新的感悟------>子类继承父类,会继承父类的方法和属性,看下图rnrnrnrn从上图可以看出,即使子类是一个空壳,他还是从父类获取到父类的属性name 和方法 test()rnrnrn但是接下来我说的就是一个小重点--->在继承当中,子类继承父类的属性和继承方法的方式上有所差别rn--->父类属性不可被重写,只会被调用,父类方法可以被重写,也可以被调用
当父类与子类有相同属性调父类
本帖最后由 宫明星 于 2012-9-29 23:17 编辑多态是父类的引用指向了自己的子类对象。但是有前提,必须是类与类之间有关系。要么继承,要么实现(或者覆盖也行)。在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。但是,有...
关于子类和父类中的this的用法
在看毕向东java视频的时候,多态这一章讲到了一段代码:npublic class Demo {n public static void main(String[] args) {n Fu f = new Zi();n f.show();n }n}nnclass Fu {n int num = 1;nn void show() {n System.out.println(this.num)
python父类能够访问子类属性,即使没在父类中定义的属性
如题。nnnIn [25]: class A(object):n ...: def f(self):n ...: print(self.p)n ...: nnIn [26]: class B(A):n ...: p = 'This is in B'n ...: nnIn [27]: B().f()nThis i...
java类中子类重写父类中的方法,父类对象用子类对象实例化以后,父类的引用如何调用父类中的被重写方法。
多态的体现。nn代码如下;nnnpackage TestMENG;nnpublic class Base {n int i = 99;nn public void amethod() {n System.out.println(" Base.amethod() ");n }nn Base() {n amethod();n }nn}nnnnnpackage TestMENG;nnpublic c...
关于继承里面子类get/set方法的小总结
/**n编写Computer类,包含CPU、内存、硬盘等属性,getDetails方法用于返回Computer的详细信息n编写PC子类,继承Computer类,添加特有属性和方法n编写NotePad子类,继承Computer类,添加特有属性和方法n编写Test类,在main方法中创建PC和NotePad对象,分别访问对象中特有的属性、方法,以及从Computer类继承的属性和方法并打印输出。 */
子类调用父类方法(super关键字)
package testextends;nnpublic class Pad3 extends Computer3{ //子类:平板电脑n n String sayhello(){ //重写父类方法‘打招呼’n return super.sayHello()+ "ipad";//调用父类方法并添加字符串n }n public static void main(Strin...
java 父类强制转换为子类
JAVA中父类只有一种情况可以转换为子类,就是对象本身引用的就是子类,如:rnnpublic class Persion {}nnpublic class Man extends Persion {}nnPersion p = new Man();nMan m = (Man) p;nrnrnrn但是在Android中发现一个另类,一直想不明白,希望大神指点一二!rnrnn// ViewGroup.
[Unity&C#&继承]unity怎么改变继承子类的父类的函数
A.cs为父类,B.cs为子类,B.cs继承A.csnC.cs为另外一个脚本,新建一个 B.cs类型 的变量 X,X变量调用 父类 A.cs 的测试函数test_fathern本文 为了 搞明白 ,如果 改变 B.cs 中的 属于父类A.cs的函数test_father。应该如何做nnnn-------------------------------------------------
java中子类继承父类的属性说明
先看一段代码:nn定义父类:nnnn定义子类1:nn定义子类2:nnnn测试类:nnnn运行结果为:nnnn可以看出,用父类实例化,子类对象继承父类对象的属性值,子类构造函数中不super()也没用。若想不继承父类的属性,直接用子类进行实例化。nn这样的情况建议使用abstract抽象类,不关注子类的实现,只声明,不实现。...
Java中父类和子类关于构造方法和私有属性的几个问题
Java中父类和子类关于构造方法和私有属性的几个问题一、什么是默认构造方法?子类构造方法与父类构造方法的关系? n通过前面的学习可以知道:默认构造方法是指无参构造方法,(1)隐式包含的默认构造方法:当类的定义中没有任何显式的构造方法(无参或有参)时,则系统默认会给该类一个隐式的无参构造方法。 (2)显式定义的默认构造方法:当类中显式定义了一个无参构造方法。 n对于以下示例://父类npublic c
如果synchronized是不可重入的,为什么重载父类函数后(重载函数也加锁)会产生死锁?
我们知道synchronized可以加在方法上也可以加在代码块上,其实加在方法上也相当于加载代码块上,好比这种形式:rnsynchronized(this){ n doSomething();n}从这里可以看出,锁其实是基于对象的,是对当前访问的对象进行加锁,现在假设有如下两个类:rnrnrnclass Widget{n synchronized doSomething(){n ....
子类重写父类属性的setter getter方法的坑
n n n 对于子类来说@property是私有的n如果我们要重写setter或者是getter方法的话,需要在父类的.h通过实例变量来重新声明一个<_属性名>变量才能够在子类正确的访问.否则不能访问父类的属性nn n nn...
关于C#中类方法的重写和覆盖
在C#中改变类中相同名称的方法的实现过程中有三种方式:重载,重写和覆盖。 n首先重载是指具有相同的方法名,通过改变参数的个数或者参数类型实现同名方法的不同实现。 n重写则是只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法,例如: npublic class A n{
java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
众所周知,java中this关键字指的是当前调用对象,一般使用方法不在此阐述public class HelloA {n public static void main(String[] args) {n new B().print();n }n}nclass B extends A{n private String s = "B" ;n public void pri
子类可以直接使用父类的变量、方法吗?
今天通过看嘉扬哥的代码 发现一个一直没注意到的问题:  rnrn    子类可以直接使用父类的变量吗?rn    答案 :可以 (只能是 protected  public 修饰的  成员变量)。rn    子类继承父类后 在方法里面可以直接使用父类的变量。  方法类似rnrn    注意:如果不是父类的成员变量就无法获取到。rnrnrn做了个小实验:rn父类:Parentrnrnrnrnrnrn
Java反射通过父类对象调用子类的方法
在做网站开发的时候我们都会写一个控制器,控制器的作用就是接收客户端的请求,有时候为了控制访问入口的唯一性,方便我们监控用户访问的数据;最近在抽时间写一个底层转发控制器请求的工具,说通俗一点就是首先我定义一个抽象类或者接口A(实现类A就标识为控制器),然后定义很多继承或者实现了A类的类B(用户真正的Controller);nn1.定义一个抽象类作为所有控制器的父类nnpackage thread;n...
java子类如何调用父类变量和方法
深入浅出,保证一看就懂npackage com.company;nn/**n * Created by liuyazhou on 2016/9/21.n */nnpublic class Test {nn // private static String str1="str1"; ///在TestSon中System.out.println(str1);报错n // p
子类能否重写父类的静态方法
今天突然讨论到了子类继承父类的静态方法问题,有人坚持说能写,有人说不能重写,那到底能不能冲写呢?这个问题很简单,测试一下就完了。n     先是父类代码:npublic class Fu {n public static void show() {n System.out.println("父类的静态方法");n }n public void method() {n System.out.
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习java子类和父类 物联网电子类课程