简短版本:
考虑以下伪代码:
class Foo {
private:
abstract type myVar;
} // This class is abstract
您将如何在标准 C++ 中实现这种行为?
长版:
我必须将大量面向 Obj 的代码从 Matlab 移植到 C++。请注意,我是世界上使用 Matlab 经验最少的人,自 2007 年以来我就不再使用 C++。
我在这个主题上搜索了很多,但我找不到我的问题的正确答案。所以我在这里:)
假设你有这个 matlab 类:
classdef Foo < handle
properties (Abstract, Dependent)
A
end
properties
B
end
methods (Abstract)
computeA()
end
methods (Access = protected)
function obj = Foo(bar)
obj.B = Matlab.BlaBlaBla(bar)
end
end
这个类(我想)不能“直接”分配,因为它的构造函数受到保护。属性“A”也是抽象的(暂时忽略也是依赖的事实)。MathWorks 告诉我们,这意味着:
- 具体的子类必须重新定义没有 Abstract 属性的抽象属性,并且必须使用与抽象超类中使用的相同的 SetAccess 和 GetAccess 属性值。
- 抽象属性不能定义 set 或 get 访问方法(请参阅属性访问方法),也不能指定初始值。定义具体属性的子类可以创建 set 或 get 访问方法并指定初始值。
那么你将如何在 C++ 中正确地翻译这种行为呢?如果我按照以下方式进行操作是否正确?(我的意思是这不是一个糟糕的设计实践)
class Foo {
private:
type A;
type B;
protected:
virtual void computeA() = 0;
Foo(type bar) { this.B = SomeFoo(bar); }
}
我认为(我可能是错的)是,如果我这样做,就必须这样做
class Subclass: Foo {
protected:
void computeA(){...}
public:
type A() { computeA(); return A; } //This is A getter that grants Dependent behavior
}
否则在编译时会出错。
我错了吗?有更好的方法吗?也是翻译 Dependent 关键字的正确方法吗?