我觉得OOP最烦人的一件事是,无论何时你需要一个成员函数中的新变量,并且你需要这个变量“附加”调用这个函数的对象,你基本上别无选择,只能创建一个新的私人领域。在我看来这很难看,因为这意味着变量在对象实例化时被初始化(如果不调用需要它的方法,你可能永远不会使用它),它不会被其他实体隐藏访问对象的私有成员,除此之外,这些方法可能会使您的类定义混乱(想想C ++类,它们通常带有包含字段中整个字段定义的标题)。
在C ++术语中,我希望static
修饰符在全局函数中的变量上行为,但在成员函数中,存储必须在对象中。
我不知道那么多语言,但我觉得在动态编程语言中它更容易实现。我能想到Lua:我只想在当前表中添加一个新索引。这并没有隐藏来自世界其他地方的新“领域”,但除非你篡改元数据,否则Lua中的所有东西都是公开的,所以它在Lua心态中并不是真正的问题。但是解决了初始化问题。
所以,我的问题是:是否存在任何静态编程语言(即,在编译时已知对象的布局),这可能是什么?
顺便说一句,C ++中是否有一个简洁的解决方法来获得类似的结果?
答案 0 :(得分:0)
你说static
并且在设计static
语言时,关于对象设计的每一件事都应该在编译时解决,而类在运行时不能自行改变它。所以我认为任何static
语言都不能做dynamic
这样的工作,并且它很好,因为当你访问一个变量时它会降低性能,在static
语言中编译器创建代码在编译时访问该变量但是如果存在这样的变量(function-object-static),那么编译器应该编写一个额外的代码来检查一些动态存储,以查看是否存在具有该名称的属性,这只是因为你对C ++的当前设计感到难过!?但另一方面,如果您不想在不更改字段的情况下执行此操作,则可以简单地将一个额外变量添加到可用于动态查找的类型的类中(例如std::map
)并生成该变量private
所以除了你班上的任何人都无法访问它:
class foo {
std::map<std::string, boost::any> functionVariables;
public:
void test1() {
int visitNumber;
auto i = functionVariables.find( "test1" );
if( i == functionVariables.end() ) {
// This is first visit of the function, initialize your variable
functionVariables["test1"] = (visitNumber = 0);
} else {
// It is already initialized, use it
visitNumber = ++ *boost::any_cast<int>(&*i);
}
}
};
答案 1 :(得分:0)
由于面向对象编程的一般思想是将行为封装为方法(函数)的 set ,将数据封装为实例变量的 set ,这种行为是不存在于我能想到的任何静态编程语言中。
然而,在一些语言中考虑了将单个类的关注点分成多个单元(以使其不那么单一)的想法。这个想法是将单个对象类中的各种关注点分开。虽然变量不是在运行时创建的(这会使类型非静态),但它可以在与其他单元分开的单元中声明。
这实际上是C#中提供的。虽然实现纯粹是装饰性的,但您可以将单个类声明为多个部分类。其中一个好处是分离关注点以避免对类封装的所有内容进行单一的大声明(另一种用法是代码生成方案)。
这可以让您执行以下操作:
File1中:
partial class Foo {
int X;
void DoSomethingWithX() {
X++;
}
}
文件2:
partial class Foo {
int Y;
void DoSomethingWithY() {
Y++;
}
}