【问题标题】:an abstract class inherits another abstract class issue一个抽象类继承另一个抽象类问题
【发布时间】:2012-11-15 12:56:50
【问题描述】:

我有一个如下的继承模式:

public abstract class BaseAttachment
{
    public abstract string GetName();
}

public abstract class BaseFileAttachment:BaseAttachment
{
    public abstract string GetName();
}

public class ExchangeFileAttachment:BaseFileAttachment
{
    string name;
    public override string GetName()
    {
        return name;
    }
}

我基本上是想调用 ExchangeFileAttachment 类的 GetName() 方法;但是,上面的声明是错误的。对此的任何帮助表示赞赏。谢谢

【问题讨论】:

  • 您是否打算在BaseFileAttachment 上提供一个全新的GetName 方法,该方法隐藏 BaseAttachment.GetName?如果没有,就省略重新声明。
  • 为什么ExchangeFileAttachment 声明为abstract?
  • “但是,上述声明是错误的” 您确实应该在问题中提供更多详细信息。它不编译吗?它不是在做你想做的事吗?如果是,有哪些错误或不良行为?
  • @Servy 对于它的价值,这至少编译得很好,所以就是这样。当然,我认为有更多细节会非常棒。
  • @YYY 他的问题仍然可能是他的项目没有编译,这将告诉我们他的问题出在未发布的代码中,或者他在发布代码时更改了某些内容。

标签: c# .net inheritance abstract-class encapsulation


【解决方案1】:

我看到的两个直接问题是您的最终ExchangeFileAttachment 类被声明为abstract,因此您将永远无法实例化它。除非你有另一个层次的继承,你没有向我们展示,否则调用它是不可能的——没有办法访问它。另一个问题是BaseFileAttachment 有一个属性将GetName() 隐藏在BaseAttachment 中。在您向我们展示的结构中,它是多余的,可以省略。因此,“更正”的代码看起来更像:

public abstract class BaseAttachment
{
    public abstract string GetName();
}

public abstract class BaseFileAttachment : BaseAttachment
{
}

public class ExchangeFileAttachment : BaseFileAttachment
{
    string name;
    public override string GetName()
    {
        return name;
    }
}

我在引号中加上了更正,因为这个用例仍然没有多大意义,所以我希望你能提供更多信息,或者这对你来说更有意义。

【讨论】:

  • 这个代码示例帮助我回答了一个完全不同的问题!
【解决方案2】:

只需从BaseFileAttachment中删除重新声明:

public abstract class BaseFileAttachment : BaseAttachment
{
}

BaseFileAttachment 已经从BaseAttachment 继承了抽象的GetName 声明。如果您真的想在BaseFileAttachment 中再次提及它,请使用override 关键字:

public abstract class BaseFileAttachment : BaseAttachment
{
    public override abstract string GetName(); // that's fine as well
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多