我正在开发一个 C++/CX 项目,刚刚遇到以下定义:
#pragma once
struct ColorHelper abstract final {
static COLORREF Lighten(COLORREF color, int amount);
static COLORREF Darken(COLORREF color, int amount);
static bool IsSystemThemeDark();
};
我有点困惑。 abstract关键字告诉我,我不能实例化这个类,但是final关键字说我cannot从它派生,那么给出了什么?这应该像一个命名空间吗?或者也许是 C# 中的静态类之类的东西?
abstract关键字告诉我,我无法实例化这个类,但final关键字告诉我,我无法从中派生,那么是什么?
是的。此类型唯一可用的操作是访问其
static
类成员。
这应该像命名空间吗?
是的,差不多。如果
ColorHelper
是一个 C++ 命名空间,那么就客户端而言,它将具有相同的接口。
那么,为什么它不是一个命名空间,而是一个定义有些晦涩的类型?
因为并不是所有的编程语言(比如C#)都支持调用自由函数。由于
ColorHelper
是一种 Windows 运行时类型,因此对其建模以支持跨语言互操作性的方式存在限制。具体来说,所有函数都需要在类型上实现,即使这意味着引入永远无法实例化的类型。
本质上,仅具有
abstract final
类成员的 static
类型在道德上相当于 C++ 命名空间,其表达方式使其可以跨所有受支持的 Windows 运行时语言进行访问。