c# - 抽象方法使用与常规方法

标签 c# abstract-class abstract-methods

我想知道两个约定之间的区别:

  1. 使用抽象方法创建抽象基类 稍后将在派生类上实现。
  2. 创建没有抽象方法的抽象基类
    但稍后在派生类级别添加相关方法。

有什么区别?

最佳答案

与接口(interface)非常相似,抽象类旨在为您的类型表达一组已知操作。然而,与接口(interface)不同,抽象类允许您实现可由任何派生类型使用的公共(public)/共享功能。例如:

public abstract class LoggerBase
{
  public abstract void Write(object item);

  protected virtual object FormatObject(object item)
  {
    return item;
  }
}

在上面这个非常基本的例子中,我基本上做了两件事:

  1. 定义了我的派生类型将遵守的契约。
  2. 提供一些默认功能,如果需要可以覆盖这些功能。

鉴于我知道 LoggerBase 的任何派生类型都有一个 Write 方法,我可以调用它。上面的等效接口(interface)可以是:

public interface ILogger
{
  void Write(object item);
}

作为一个抽象类,我可以提供一个额外的服务FormatObject,它可以被选择性地覆盖,比如我正在写一个ConsoleLogger,例如:

public class ConsoleLogger : LoggerBase
{
  public override void Write(object item)
  {
    Console.WriteLine(FormatObject(item));
  }
}

通过将 FormatObject 方法标记为虚拟方法,这意味着我可以提供共享实现。我也可以覆盖它:

public class ConsoleLogger : LoggerBase
{
  public override void Write(object item)
  {
    Console.WriteLine(FormatObject(item));
  }

  protected override object FormatObject(object item)
  {
    return item.ToString().ToUpper();
  }
}

所以,关键部分是:

  1. 抽象类必须继承。
  2. 抽象 方法必须在派生类型中实现。
  3. virtual 方法可以在派生类型中被覆盖。

在第二种情况下,因为您不会向抽象基类添加功能,所以在直接处理基类的实例时无法调用该方法。例如,如果我实现了 ConsoleLogger.WriteSomethingElse,我就无法从 LoggerBase.WriteSomethingElse 调用它。

关于c# - 抽象方法使用与常规方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601222/

相关文章:

c# - 在抽象类中返回具体类型

python - 对于抽象类来说,实例化的最佳方法是什么?

c# - 在大型多解决方案应用程序中维护 .NET 项目依赖项和更新二进制文件的最佳方式

c# - 使用 Moq 框架模拟方法不会返回预期结果

c# - LINQ 连接多对多关系

c# - 为什么从带有 where 子句的抽象类派生的类不能强制转换为它的最低公共(public)类

c# - SimpleData 复杂连接和投影到 poco 类型

c# - 抽象类中的泛型方法

java - 创建新的抽象方法与接口(interface)方法

java - 在 Java 中,什么时候应该在接口(interface)中使用抽象方法?