eC(Ecere)如何不用担心类的私有数据字段 在显示库的C++(或java)接口时,必须提供类的“私有”字段,这是不可理解的,因为编译器需要知道类的结构,以便能够计算例如siZeof()。

eC(Ecere)如何不用担心类的私有数据字段 在显示库的C++(或java)接口时,必须提供类的“私有”字段,这是不可理解的,因为编译器需要知道类的结构,以便能够计算例如siZeof()。,java,c++,api,encapsulation,Java,C++,Api,Encapsulation,但为什么需要这样做?如何缓解?因为,对我来说,这似乎违反了封装概念:为什么用户会担心或者访问被认为是私有的东西 一种解决方案是为每个对象定义一个size()函数,但这在运行时会很麻烦 然而,一种语言(eC/ecere)声称[1]: “库开发人员不必担心最终用户看到类定义的私有内容,只有声明为公共的内容才可见” 这是如何实现的,以及如何在java或C++中实现类似的? [1] 您可以通过只公开接口而不公开实现来轻松实现封装。C++接口只是一个纯纯方法类: class Interface { pub

但为什么需要这样做?如何缓解?因为,对我来说,这似乎违反了封装概念:为什么用户会担心或者访问被认为是私有的东西

一种解决方案是为每个对象定义一个size()函数,但这在运行时会很麻烦

然而,一种语言(eC/ecere)声称[1]:

“库开发人员不必担心最终用户看到类定义的私有内容,只有声明为公共的内容才可见”

<>这是如何实现的,以及如何在java或C++中实现类似的?
[1]

您可以通过只公开接口而不公开实现来轻松实现封装。C++接口只是一个纯纯方法类:

class Interface
{
public:
    virtual void method() = 0;
};
如果您的API基于接口,那么除了封装之外,它还将更加模块化和灵活,耦合更少,更易于测试。因此,在API中使用接口而不是实现类是非常可取的


当然,您必须使用工厂、构建器和其他设计模式来构造实现接口的实际实例。

仅仅因为程序员或编译器可以“看到”私有类型,并不意味着它违反了“封装”。把封装看作是一个“契约”(你不应该使用它,但你仍然可以看到它)。p> 。。。然而

如果您真的想“隐藏”底层表示,那么您的问题的答案是使用不透明指针:

下面是C++中的一个示例:

我在C++上买的早期书籍之一是James Coplien的《酸书》。 (正如迈尔斯所说)。今天里面的很多东西都有更多的面包 涂黄油,虽然你还没读过,但你应该读。什么之中的一个 詹姆斯(或者吉姆,这个名字真好)介绍的东西 皮姆皮姆。私有实现是对 名字越奇怪,指向实现的指针就越可信。在里面 简单来说,它是一个编译器防火墙,或者是一个 有效地从外部隐藏任何类的实现


eC有一个运行时反射模型,它知道所有类的布局,并区分struct(总是就地分配)和类(类总是通过知道类布局的运行时机制在堆上分配)

这背后的思想是,可能是大量和/或连续的小对象(例如点)更适合于结构,而需要内存管理的更复杂对象更适合于类。这还允许交换具有相同接口但布局完全不同的库

< C++ > piml的需求只是我无法忍受C++ C++(另一个是头文件)的一个原因,它在试图为ECEL构建C++类库后感到不满。 < >我看到C++代码扩展到API、API标头、实现、实现头的4个不同文件,其中每个行有许多行,而不是简单地在EC:

中。
public class MyClass
{
   public int myFunction() {  }
   private int myPrivateMember;  
}
顺便说一句,eC有一个新网站:)(仍有待改进)。
我总是乐于回答问题,并在论坛和IRC上提供帮助

谢谢你这么好的回答。我真的很抱歉,我不能选择“接受”,但你的建议是非常,非常好,我鼓励投票这个答案。唯一的缺点是你必须事先考虑,谢谢你的回答。信息量很大。我也很好奇eC是如何做到这一点的。未能在eC中找到说明性示例。PIMPL是众所周知的,它也有助于编译(无需在每次添加/删除/修改私有字段声明时重新编译包含头的所有源文件),但是,它引入了间接级别。
public class MyClass
{
   public int myFunction() {  }
   private int myPrivateMember;  
}