繁体   English   中英

为什么基类=新派生类不能调用派生类方法?

[英]Why base class = new derived class cannot call derived class method?

我们有两个类 A 和 B,B 派生自 A,我创建了A a = new B(); 为什么在我的代码中调用不包含 AI 的 B 方法时会出错。 这是否意味着 Type Object Pointer 是 A 类型? 其次,为什么当我调用SomeMethod它调用 A 而不是 B 的方法?

在堆这种情况下创建对象实例时,类型对象指针指向A还是B?

class A
{
    public void SomeMethod()
    {
        Console.Write("This is A");
    }
}

class B : A
{
    public void SomeMethod()
    {
        Console.Write("This is B");
    }

    public void OtherMethod()
    {
        Console.Write("This is New method");
    }
}
class Program
{
    static void Main(string[] args)
    {
        A a = new B();

        a.SomeMethod(); // This is A method
        a.OtherMethod(); // I get error here that a does not contain definition for this method

    }
}

因为您错过了 IDE 中的明显警告

严重性代码描述项目文件行抑制状态警告 CS0108“B.SomeMethod()”隐藏继承的成员“A.SomeMethod()”。 如果打算隐藏,请使用 new 关键字。

编译器警告(级别 2)CS0108

“member1”隐藏继承的成员“member2”。 如果打算隐藏,请使用 new 关键字。

变量被声明为与基类中的变量同名。 但是,没有使用 new 关键字。 此警告通知您应该使用 new; 变量的声明就像在声明中使用了 new 一样。

如果要隐藏它,请使用new关键字

但是,如果您想调用它,请使用virtualoverride它,或者只是更改方法名称,这样您就不会隐藏它

class A
{
   public virtual void SomeMethod()
   {
      Console.Write("This is A");
   }
}

class B : A
{
   public override void SomeMethod()
   {
      base.SomeMethod();
      Console.Write("This is B");
   }

   public void OtherMethod()
   {
      Console.Write("This is New method");
   }
}

虚拟(C# 参考)

virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中覆盖它们。 例如,此方法可以被任何继承它的类覆盖:

覆盖(C# 参考)

需要覆盖修饰符来扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。

多态(C# 编程指南)


在堆这种情况下创建对象实例时,类型对象指针指向A还是B?

您不必担心堆上发生的事情(这些是实现细节),只需担心语言允许您做什么。

但是,A 在技术上不存在,只有 B 的一个实例,它具有 A 的所有实现(如果需要)

您必须指定要覆盖虚拟功能。 尝试这个:

class A
{
    public virtual void SomeMethod()
    {
        Console.Write("This is A");
    }
}

class B : A
{
    public override void SomeMethod()
    {
        Console.Write("This is B");
    }

    public void OtherMethod()
    {
        Console.Write("This is New method");
    }
}

要访问当前失败的其他方法,您需要告诉您的AB一样行事。

改变

a.OtherMethod();

(a as B).OtherMethod();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM