eC(Ecere)如何不用担心类的私有数据字段
eC (Ecere) how to not worry about private data fields of a class
在公开库的C++(或Java)接口时,必须提供类的"私有"字段,这是可以理解的,因为编译器需要知道类的结构,以便能够计算,例如sizeof()。
但是,为什么需要这样做,以及如何减轻这种情况呢?因为,对我来说,这似乎违反了封装概念:为什么用户会担心或有权访问被认为是私人的东西?
一种解决方案是为每个对象定义一个size()函数,但这在运行时会很麻烦。
尽管如此,有一种语言(eC/ecere)声称[1]:
这是如何在eC中实现的,类似的功能如何在Java或C++中实现?
[1]http://www.ecere.com/technologies.html
仅仅因为程序员或编译器可以"看到"私有类型,并不意味着它违反了"封装"。将封装视为一个"契约"(您不应该使用它,但您仍然可以看到它)。
然而。。。
如果你真的想"隐藏"底层表示,那么这个问题的答案就是使用不透明的指针:
-
http://en.wikipedia.org/wiki/Opaque_data_type
-
http://en.wikipedia.org/wiki/Opaque_pointer
下面是C++中的一个例子:
http://www.tilander.org/aurora2/Stupid_Cpp_Tricks/index.html
我早期在C++上买的一本书是James Coplien的《酸书》(正如迈耶斯所说)。今天里面的很多东西都是面包黄油之类的东西,虽然你还没读过,但你应该读。其中之一詹姆斯(或者吉姆,这个名字有多好听)介绍的东西Pimpl idom。私人实施是对名字越奇怪,指向实现的指针就越可信。在里面简单来说,它是一个编译器防火墙,或者是一个不透明的类型有效地向外部隐藏了任何类的实现。
// in the header
class Foo
{
public:
Foo();
~Foo();
private:
struct Pimpl; // forward declaration to internal structure
Pimpl* m; // opaque pointer to actual data
};
// in the cpp file
struct Foo::Pimpl
{
std::string name;
};
Foo::Foo()
: m( new Pimpl)
{
}
Foo::~Foo()
{
delete m;
}
您可以通过只公开接口而不公开实现来轻松实现封装。在C++中,接口只是一个只有纯虚拟方法的类:
class Interface
{
public:
virtual void method() = 0;
};
如果您的API是基于接口的,那么除了封装之外,它还将更加模块化和灵活,耦合更少,更易于测试。因此,在API中使用接口而不是实现类是非常可取的。
当然,您将不得不使用工厂、构建器和其他设计模式来构建实现接口的真实实例。
eC有一个运行时反射模型,它知道所有类的布局,并区分struct(总是在原地分配)和类(类总是在堆上分配,通过知道类布局的运行时机制)。
这背后的想法是,可能是多个和/或连续的小对象(例如Point)更适合结构,而需要内存管理的更复杂的对象更适合类。这也可以允许交换具有相同界面但完全不同布局的库。
对C++"pimpl"的需求只是我无法忍受的事情之一,C++(另一个是头文件)让我设计了eC,因为我不满意为Ecere构建C++类库。
我已经看到C++代码激增到API、API头、实现、实现头的4个不同文件,每个文件中有许多行,而不是简单地在eC:中
public class MyClass
{
public int myFunction() { }
private int myPrivateMember;
}
Btw eC有一个新网站:)http://ec-lang.org(仍有待改进)。我总是很乐意在论坛和IRC上回答问题并提供帮助!
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何使用位字段将数据从二进制文件复制到结构中?
- 如何避免在数据结构中包含存储为字段的类?
- TOS字段从Linux的TCP插座上接收到的数据包获取
- 从数据集 Blob 字段中打开和编辑文件
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 如何为我的 Vulkan 类创建此通用数据结构字段
- 在Boost多索引容器中搜索位字段数据
- 如何从 GStreamer 管道读取数据中的特定字段
- 您将使用哪种数据模型在 QML 中制作二维字段 100*100
- C++ 中的 10 位或 12 位字段数据类型
- 使数据输入字段记住其值,从一次运行到下一次运行
- 在不模拟Ctrl+V的情况下将数据粘贴到任何应用程序输入字段中.Windows c++
- C++读取元数据文件,并处理由空白和:混合分隔的字段
- 基于多个字段搜索大型数据集的有效方法
- 为什么 C++ 类需要在类范围之外定义静态字段(数据成员)
- 使用 ADO 将原始文件数据插入访问表的 BLOB("OLE 对象")字段
- 原始数据包创建导致 IP 字段顺序不正确
- 难以读取的armadillo字段数据结构
- 该字段太小,无法接受您在写入excel时尝试添加的数据量