当前位置:编程学习 > C#/ASP.NET >>

多态的问题

 B b = new B();
 A a = b;
 a.F();
A a=b实际上a还是批向了b对象,a.F()怎么会去调动用A里的F这个方法呢?
求指点。。

    class A
    {
        public void F() { Console.WriteLine("A.F"); }
    }
    class B : A
    {
        new public void F() { Console.WriteLine("B.F"); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.F();
        }
--------------------编程问答-------------------- 因为 new
话说有必要老是玩这个梗吗?
出题的人真无聊。  --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/vstudio/51y09td4.aspx

new 运算符
用于创建对象和调用构造函数。

new 修饰符
用于向基类成员隐藏继承成员。
我不继承父的东西,我要自己搞(还有其他方式实现多态;virtual override)
http://msdn.microsoft.com/zh-cn/library/ebca9ah3(v=vs.90).aspx

new 约束
用于在泛型声明中约束可能用作类型参数的参数的类型。 --------------------编程问答-------------------- 父类跟子类的方法都要执行一次吧? --------------------编程问答-------------------- B b = new B();
A a = b;
a.F();

亏好A中有一个F(),否则这代码根本就编译不过去。也就是说无论如何都不会执行B.F();不信你把A的F删除了试试看。

判断一个教C#的老师是否有资格站在讲台上的一个典型办法就是,如果一个老师把new(方法隐藏)拿来和继承、覆盖一起讲,就说明这个货只是一个做题的主,根本没有写过程序,更不配当老师。

方法隐藏是一种极其罕见的语法,罕见到你有机会动用公交车上的逃生铁锤也未必有机会在实际开发中使用一回。 --------------------编程问答-------------------- 如果一个方法没有被修饰成virtual,(其实是省略了sealed修饰)那么它就不允许被重写。
好比如果一个变量没有加上protected或者public(其实是省略了private修饰),那么你就不能在派生类中访问一样。

但是好在当老师的基本还没有愚蠢到在课堂上大谈特谈如何在一个派生类中非要访问基类的私有成员。但是他们的头脑的智慧也就大多止步于此了。 --------------------编程问答--------------------

new public void F() { Console.WriteLine("B.F"); }


1  2 楼 都说了  --------------------编程问答-------------------- 你这个根本就不存在什么多态,只是对方法的重写(overwrite)。

我也觉得真无聊。 --------------------编程问答--------------------
Quote: 引用 5 楼 caozhy 的回复:

如果一个方法没有被修饰成virtual,(其实是省略了sealed修饰)那么它就不允许被重写。
quote]

补充一点,如果方法是被修饰成abstract的,那它就必须被重写 --------------------编程问答-------------------- 纠正下,如果子类没有把这个从父类继承的抽象方法同样定义为抽象方法,那子类就必须重写这个方法 --------------------编程问答-------------------- 一直也搞不懂,为什么要多态。
--------------------编程问答-------------------- 明白一个道理就行了,狗一定是动物,动物不一定是狗 --------------------编程问答-------------------- 楼主写的这个例子明明讲述的是覆盖,而不是多态,多态是用 virtual 和 override 的。 --------------------编程问答-------------------- 你得重写积累函数 --------------------编程问答-------------------- 既然你知道要写上 new 才行,为什么不为你的方法另起一个没有冲突的名字,例如  public void F1()

为什么偏要将完全无关的方法取名叫做F,你能说出非要重名而又不想遵循面向对象继承机制规范的道理来吗?

我们禁用这类写法。如果我们招聘时出这种题目,是浪费时间的。 --------------------编程问答-------------------- 答案是bf,但是不知道楼主为什么这样写 --------------------编程问答-------------------- 我通常是用new来做类型转换 ,隐藏基类方法,return (MyClass)base.F(); --------------------编程问答-------------------- new 是对函数功能的隐藏,可以类比为C++中的重写,使用new的话,A中F的功能还是在的,表面B中也有个名为F的功能,在调用B类型的变量时会自动屏蔽A中的F。LZ如果要通过继承将A中F的功能改变的话将new改为override关键字 --------------------编程问答-------------------- 基类派生的不同子类对同一方法调用产生不同结果的情况就称作多态
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,