为什么需要抽象类?

bal*_*569 2 c# abstract-class

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

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

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

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

For abstraction and re-use
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*Tao 6

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

// hasty code, might be written poorly
public abstract class FileParser<T> {
    private readonly List<T> _contents;
    public IEnumerable<T> Contents {
        get { return _contents.AsReadOnly(); }
    }

    protected FileParser() {
        _contents = new List<T>();
    }

    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);
}
Run Code Online (Sandbox Code Playgroud)

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


Otá*_*cio 5

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


GvS*_*GvS 5

当您创建继承树时,您(可能)需要抽象类,并且具有无法实例化的单个祖先,这仅仅是因为不知道如何实现某些方法。

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

  • 示例 1 如果您需要 a和 a
    的单个祖先,您可能会创建一个类。您无法启动本课程,因为它尚未完成。A本身是行不通的。这就是为什么会是抽象的。CarBicycleVehicleVehicleVehicleVehicle

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

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

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