代码之家  ›  专栏  ›  技术社区  ›  user1284631

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

  •  2
  • user1284631  · 技术社区  · 10 年前

    在公开库的C++(或Java)接口时,必须提供类的“私有”字段,这是可以理解的,因为编译器需要知道类的结构,以便能够计算例如sizeof()。

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

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

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

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

    如何在eC中实现这一点,以及如何在Java或C++中实现类似的功能?

    [1] http://www.ecere.com/technologies.html

    3 回复  |  直到 10 年前
        1
  •  2
  •   FoggyDay    10 年前

    仅仅因为程序员或编译器可以“看到”私有类型,并不意味着它违反了“封装”。将封装视为“契约”(您不应该使用它,但仍然可以看到它)。

    …然而。。。

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

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

    http://www.tilander.org/aurora2/Stupid_Cpp_Tricks/index.html

    我在C++上购买的早期书籍之一是詹姆斯·科皮恩的《酸书》 (正如梅耶斯所说)。今天里面的很多东西都是面包 黄油之类的东西,虽然你没读过,但你应该读。什么之中的一个 詹姆斯(或吉姆,这个名字多么好听)介绍的东西是 Pimpl idom公司。私人实施是对 名字越奇怪,指向实现的指针就越合理。在里面 简单来说就是编译器防火墙,或者 opaque type 那个 有效地向外部隐藏任何类的实现。

    // 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;
    }
    
        2
  •  2
  •   nogard    10 年前

    通过只公开接口而不公开实现,可以轻松实现封装。在C++中,接口只是一个只有纯虚拟方法的类:

    class Interface
    {
    public:
        virtual void method() = 0;
    };
    

    如果您的API基于接口,那么除了封装之外,它还将更加模块化和灵活,耦合更少,更易于测试。因此,在API中使用接口而不是实现类是非常理想的。

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

        3
  •  1
  •   Jerome    10 年前

    eC有一个运行时反射模型,它知道所有类的布局,并区分结构(总是在适当的位置分配)和类(类总是在堆上分配,通过了解类布局的运行时机制)。

    这背后的想法是,可能是多个和/或连续的小对象(例如Point)更适合于结构,而需要内存管理的更复杂对象更适合于类。这也允许交换具有相同界面但布局完全不同的库。

    对C++“皮条客”的需求只是我对C++(另一个是头文件)无法忍受的事情之一,在我不满意为Ecere构建C++类库之后,我设计了eC。

    我看到C++代码扩展到4个不同的文件,分别是API、API头、Implementation和Implementation头,每个文件中都有很多行,而不是简单的eC:

    public class MyClass
    {
       public int myFunction() {  }
       private int myPrivateMember;  
    }
    

    Btw eC有一个新网站:) http://ec-lang.org (仍有待改进)。 我总是很乐意在论坛和IRC上回答问题和提供帮助!