考虑 C++ 代码
#include<iostream>
template <typename T>
struct Base
{
T &Foo()
{
// MSVC 需要这个提示来优化 static_cast 的空指针检查。
// __assume(this != nullptr);
static_cast<T *>(this)->FooImpl();
return *static_cast<T *>(this);
}
protected:
~Base() = default;
};
struct Derived : Base<Derived>
{
private:
friend Base<Derived>;
void FooImpl() { std::cout << "没有虚拟方法调用" << std::endl; }
};
问题是如何在 C# 里做出等价实现,满足:
FooImpl
是否虚拟。Base
的泛型参数是正确的子类。friend
),且编译期也不能破坏封装。第一个问题可以通过利用 CLR 对泛型参数实例化为 struct
时的优化实现,第二个则需要巧妙设置对应 struct
的接口和实现,使只有 Base
及其子类可以正常访问方法。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.