为什么需要抽象类?

可能重复:
什么是抽象类?

1.创建无法实例化的类有什么意义?

最常用作基类或接口(某些语言有单独的接口结构,有些没有) – 它不知道实现(由子类/实现类提供)

为什么有人想要这样的课?

For abstraction and re-use 

3.抽象类变为必要的情况是什么?任何人都可以通过一个例子来简要介绍它吗?

抽象类并不总是必要的 ,但它们通常非常方便 。 假设我想为特定类型的文本文件编写解析器。

 // hasty code, might be written poorly public abstract class FileParser { private readonly List _contents; public IEnumerable Contents { get { return _contents.AsReadOnly(); } } protected FileParser() { _contents = new List(); } public void ReadFile(string path) { if (!File.Exists(path)) return; using (var reader = new StreamReader(path)) { while (!reader.EndOfStream) { T value; if (TryParseLine(reader.ReadLine(), out value)) _contents.Add(value); } } } protected abstract bool TryParseLine(string text, out T value); } 

在抛出类似上面的内容后,我已经完成了任何FileParser -esque类所需的样板代码。 我需要为任何派生类做的就是简单地覆盖一个抽象方法 – TryParseLine而不是编写处理流等的所有相同繁琐的东西。此外,我可以在以后轻松添加function – 例如exception处理 – 它将适用于所有派生类。

抽象类允许您编写一段通用代码,将特定决策推迟到派生类,从而减少代码重复。

您(可能)在创建inheritance树时需要抽象类,其中单个祖先无法实例化,仅仅因为未知如何实现某些方法。

将类标记为抽象是告诉编译器:

  • 例1
    如果您需要单个祖先用于CarBicycle ,您可能会创建一个Vehicle类。 您无法启动此Vehicle类,因为它未完成。 Vehicle本身不起作用。 这就是为什么Vehicle将是抽象的。

  • 例2
    .Net框架的另一个例子。 Stream类是一个提供基本I / Ofunction的抽象类。 它提供了一个Read和Write方法来处理底层流的字节。

该流可以是FileStreamNetworkStreamMemoryStream等。 Stream本身不知道如何从流的具体实现中读取或写入。 但是实现了Stream一些方法,因为它们由流的所有实例共享。

这不可能与接口有关。 所以你需要创建一个类。 由于无法实现ReadWrite方法,因此Stream被标记为抽象。 这将阻止按原样创建Stream类。

抽象类绝不是绝对必要的。 您始终可以使用非抽象类,并为方法提供存根,否则这些方法将是抽象的。 您还可以通过仅为类提供受保护的构造函数来近似抽象的各个方面。

但不是这一点。 当一个类用于对一组子类的广义属性和行为进行建模时,您希望将其标记为抽象以使您的意图清晰。

我知道我需要在执行应用程序之间保存信息。

我大致知道我需要采用哪些方法来实现这一目标。 我还可以提供几种执行整个数据存储操作的各个部分的方法。

我知道我的客户对数据存储有不同的要求,基于偏好(MS Sql,Oracle)和法律(健康行业安全要求)。

我如何提供一个能够完成80%重物的物体,但最后20%的物品可以进行定制?

抽象基类允许我们为每个客户定制最后20%,然后重用基类中80%的公共代码。 此外,抽象类不会遇到接口面临的版本问题 ,这是一个奖励。

我可以编写我的应用程序代码,提供抽象基类的默认实现,测试并部署它,而不必为每个客户端提供不同的版本。 当客户端请求不同的存储方法时,可以通过dependency injection在运行时提供和使用不同的实现。