【问题标题】:Calling a Derived class ovverridden function in c#在 C# 中调用派生类 ovverridden 函数
【发布时间】:2014-05-23 15:56:53
【问题描述】:

我有一个用作父类的类,它具有我想在派生类中覆盖的 c () 函数,但基类 c 函数被调用。这是我的类的伪代码。可能是这个关键字一起赋予了它不同的含义

public Class BaseRepository
{
    public A()
    {
        this.c();
    }

    public B()
    {
        this.c();
    }

    protected virtual c()
    {
        enter code here
    }
}

当我派生这个类时

class customRepo:BaseRepository
{
    protected override c()
    {
        ...does something
    }
}

我的自定义 repo 函数没有使用自定义 repo 类中的c(),而是使用基本 repo 类 正在使用功能。谁能告诉我为什么会这样???

【问题讨论】:

  • 如果您实际处理的是 customRepo 类的实例,这看起来是正确的。您的问题可能是您覆盖的 c 函数调用了base.c();
  • 你怎么称呼它?您是否实例化了自定义 Repo 或 BaseRepository?如果你实例化了基类,它对派生类一无所知。
  • +1 McAden 和 Bradley.Net。请说明您如何调用 c() 以及方法中可能的相关部分。
  • 如果您可以尝试将 BaseRepository 抽象化,那么如果您确实在创建基类的实例(我们都怀疑您是这样),您将收到编译器错误
  • 我刚刚在我的机器上做了一个示例,它调用了派生的c 函数。你应该给我们一个SSCCE,它实际上证明了这个问题

标签: c# inheritance this virtual


【解决方案1】:

发生这种情况的最可能(而且只有我能想到的)原因是您实例化了 BaseRepostiory 而不是 customRepo 对象。

多态调用实际创建的类型的最派生函数,因此创建customRepo 对象将调用customRepo.C,创建BaseRepository 将调用BaseRepository.C。

进一步说明,类并不神奇地知道它们的派生,它们也不调用派生方法。这是有道理的,因为如果你有多个派生,你会调用哪个方法?以下行将按您的预期工作(调用派生类):

BaseRepository custom = new customRepo();
custom.A();

这个不会:

BaseRepository base = new BaseRepostiory();
base.A();

【讨论】:

  • 我试图用机翼名称实例化错误的类
猜你喜欢
  • 2021-09-14
  • 2016-03-27
  • 2011-09-08
  • 2011-07-13
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多