【问题标题】:base class extended object implamentation基类扩展对象实现
【发布时间】:2013-03-27 17:10:32
【问题描述】:

有点菜鸟问题,但是嘿嘿。

例子:

BaseClass bc = new ExtendedClass(); //Assume ExtendedClass inherits from BaseClass
((BaseClass)bc).ExtendedMethod();
bc.ExtendedMethod();
((ExtendedClass)bc).ExtendedMethod(); //overridden in ExtendedClass

ExtendedClass ec = new ExtendedClass();
((BaseClass)ec).ExtendedMethod();
ec.ExtendedMethod();
((ExtendedClass)ec).ExtendedMethod(); //overridden in ExtendedClass 

?

bc.ExtendedMethod();ec.ExtendedMethod(); 在运行时会调用哪些实现?他们会有所不同吗?我假设强制转换的调用将调用类中的特定实现。

编辑:添加相关标签。

【问题讨论】:

  • 你为什么不自己试一试,设置一个带有基类和子类的示例项目并查看
  • 只有在扩展中出现的方法需要转换才能从扩展的基类对象中使用,我实际上是在看我是否可以抓住这个 ty alex 并且实际上将它放在有用的地方,这样每个程序员都不必测试它来找出答案。
  • 视情况而定; ExtendedMethod 是虚拟的吗?
  • 这是一个关于概念的问题——它可能是。

标签: c# inheritance casting polymorphism base-class


【解决方案1】:

在所有三种情况下,将调用 ExtendedMethod 的覆盖实现,因为您正在创建 ExtendedClass 的实例。毕竟,这就是polymorphism 的意义所在。

【讨论】:

    【解决方案2】:
    public class Base
    {
        public void Extends()
        {
            Console.WriteLine("Base class");
        }
    }
    
    public class Extend : Base
    {
        public new void Extends()
        {
            Console.WriteLine("Extend class");
        }
    }
    
    
    public class Program
    {
        public static void Main()
        {
    
            Base b = new Base();
            b.Extends();
    
            Extend e = new Extend();
            e.Extends();
    
            Base be = new Extend();
            be.Extends();
    
            Console.Read();
    
       }
    
    }
    

    结果如下:

    Base class
    Extend class
    Base class
    

    注意,您还可以在 Extend 类中使用 new 关键字来隐藏基本的 Extends 函数。

    public new void Extends() 
    {
    
    }
    

    【讨论】:

    • 啊,好吧 - 如果你使用 virtual+override 最后一个是扩展的;但如果你使用“new”,最后一个是 Base。
    猜你喜欢
    • 2012-05-03
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多