使用基类的引用

to189 2018-04-14 02:48:32
新学C#,其中在继承中有一个知识点:使用基类的引用,例如:
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();

这里的第2行,搞不懂,为什么不直接 MyBaseClass mybc = new MyBaseClass (); 呢,非要通过派生的转换?直接一点不是理好吗?
是不是这个知识点在有其它的使用场景?
...全文
880 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
raynors 2018-04-15
  • 打赏
  • 举报
回复
教材上的东西,很多是概念。用的时候不是这么用的,所以产生混淆。

   MyDerivedClass derived = new MyDerivedClass();
   MyBaseClass mybc = (MyBaseClass)derived;
   derived.Print();
   mybc.Print();
为什么不MyBaseClass mybc = new MyBaseClass ();呢 因为derived 当做参数被使用的,你NEW一个有什么用。 MyBaseClass可能有无数个子类,如myclass1,myclass2,myclass3...... 但我的引用函数只有一个。 我不可能写无数个引用函数诸如:

int funcx1(myclass1 derived){}
int funcx2(myclass2 derived){}
...........
正常的语句可能是这样的。

int funcx(object derived)
{
   MyBaseClass mybc = (MyBaseClass)derived;
   mybc.Print();
}
xuzuning 2018-04-14
  • 打赏
  • 举报
回复
那页书上给出了两种继承的形态,请你认真看完 第一例 使用了覆盖(new),即在子类方法去替代父类的同名方法,因此 derived.Print(); //执行的是子类方法 mybc.Print(); //执行的是父类方法 第二例 使用了重写(override),即在子类方法中给父类同名方法以新意,所以 derived.Print(); //执行的是子类方法 mybc.Print(); //执行的是子类方法 虽然从外观上看,他们没有什么区别
  • 打赏
  • 举报
回复
多态通常是用来调用之前开发的、通用的东西。例如
void test()
{
    var a = new MyDerivedClass();
    通用处理(a);
}

void 通用处理(MyBaseClass list)
{
    list.print();
}
这里的“通用处理”过程是对凡是具有 MyBaseClass 父类(或者接口)的对象的通用操作流程,这时候才会看到使用多态特性。 如果在代码中直接看到
void test()
{
    var a = new MyDerivedClass();
    var b= (MyBaseClass)a;
    通用处理(b);
}
这自然就是多于地使用抽象类型来书写代码了。方法 test 中不使用 MyBaseClass 才更直接一点。
to189 2018-04-14
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
噢,原来你是在啃书 http://www.cnblogs.com/caofangsheng/p/4869045.html
是的,正在学习
to189 2018-04-14
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
[quote=引用 楼主 to189 的回复:]搞不懂,为什么不直接 MyBaseClass mybc = new MyBaseClass (); 呢
真正的多态代码是
MyBaseClass mybc = new MyDerivedClass();
不是你写的那种代码。[/quote] 老师,你好,有没有关于 继承 、多态(特别是多态) 相关通俗易懂的文章介绍一下,感觉有些知识点太绕,是不是要全部学,后面的开发是否用得到?
xuzuning 2018-04-14
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
在面向对象的语言规范中,这里的 derived 和 mybc 都引用同一个对象,调用 print() 结果完全一样。声明为 MyBaseClass 类型的变量 mybc 引用了一个 MyDerivedClass 对象实例。 在编程中确实没有必要写第二行,没有必要声明 mybc 变量。这就好像有的人明明知道一个对象是 List<string> 类型的,非要声明变量或者函数类型为 IList<string> 这就是有点绕。但是假设说他确实不确定实际对象的最终类型,只是知道对象一定是继承子 IList<string>,那么这样写自然就是有必要的了。 你贴的这段代码,可能只是让你测试一下两个变量引用同一个对象实例。这一点上来说是完全可以理解的。但是实际应用中这样写自然是没有必要。 不过这样的代码很容易被人接下来用来验证 new 关键字,就展示了 c# 的一个糟粕,这时候看上去就有必要这样写了——因为糟粕被当作了c#的一个特性。
  • 打赏
  • 举报
回复
引用 楼主 to189 的回复:
搞不懂,为什么不直接 MyBaseClass mybc = new MyBaseClass (); 呢
真正的多态代码是
MyBaseClass mybc = new MyDerivedClass();
不是你写的那种代码。
  • 打赏
  • 举报
回复
15年前的 c# 从 MS C++ 继承了一个糟粕,就是类似
class A
{
    public void print()
    {

    }
}

class B: A
{
    public new void print()
    {

    }
}
这种破坏了面向对象基本设计原则的东西。既然这里明知道 B 是破坏了继承规则的,为什么不另外起一个名字(例如叫做 print2)而非要用什么 new 关键字呢? 通常看到你贴的这类代码,写代码的人可能是故意来用这种糟粕语法来考试的。
xuzuning 2018-04-14
  • 打赏
  • 举报
回复
你先看一下这两句的输出结果都是什么 derived.Print(); mybc.Print(); 然后再告诉你这样写的原因

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧