可能重复:
什么是抽象类?
1.创建无法实例化的类有什么意义?
最常用作基类或接口(某些语言有一个单独的接口构造,有些没有) - 它不知道实现(由子类/实现类提供)
为什么有人想要这样的课?
For abstraction and re-use
Run Code Online (Sandbox Code Playgroud)
3.抽象类变为必要的情况是什么?任何人都可以通过一个例子来简要介绍它吗?
抽象类并不总是必要的,但它们通常非常方便.假设我想为特定类型的文本文件编写解析器.
// 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而不是编写处理流等的所有相同繁琐的东西.此外,我可以在以后轻松添加功能 - 例如异常处理 - 它将适用于所有派生类.
当您创建继承树时,您(可能)需要抽象类,并且具有无法实例化的单个祖先,这仅仅是因为不知道如何实现某些方法。
将类标记为抽象是告诉编译器:
示例 1 如果您需要 a和 a
的单个祖先,您可能会创建一个类。您无法启动本课程,因为它尚未完成。A本身是行不通的。这就是为什么会是抽象的。CarBicycleVehicleVehicleVehicleVehicle
示例 2
.Net 框架的另一个示例。该类Stream是一个提供基本 I/O 功能的抽象类。它提供了一个 Read 和 Write 方法来处理底层流的字节。
该流可以是FileStream、NetworkStream、MemoryStream等。它Stream本身不知道如何从流的具体实现中读取或写入。但有些方法Stream是被实现的,因为它们被流的所有实例共享。
这是通过接口不可能做到的。所以你需要创建一个类。由于Read和Write方法无法实现,Stream因此被标记为抽象。这将阻止Stream按原样创建该类。
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |