eC(Ecere)如何不用担心类的私有数据字段

eC (Ecere) how to not worry about private data fields of a class

本文关键字:数据 字段 担心 Ecere 何不用 eC      更新时间:2023-10-16

在公开库的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上回答问题并提供帮助!