什么是正确的封装语法?

问题描述:

我有出版物和图书馆两个类和出版类。如何操作(作为封装)流派,媒体和target_age,如果我想让它们成为单独的类。这不是另一个班级的班级。 这个流派有更多的类型(小说,非小说,自助,表演)以及媒体和时代。我已经完成了我的研究,我正在学习它的正确语法。什么是正确的封装语法?

class Publication {  
    private: 
    string title; 
    string authore; 
    string copyright; 
    Genre genre; 
    Media media; 
    Age target_age; 
    string isbn; 
    bool checked_out; 
    string patron_name; 
    string patron_phone; 

    public: 
    void check_out(string patron_name, string patron_phone){} 
    void check_in(){} 
    bool is_checked_out(){} 
    string to_string(){} 
}; 

封装的最好方法是将所有内容都保密。为可能从外部读取的内容创建常量getter,并在构造函数中初始化所有内容。毕竟,作家/标题/等等。不应该改变一个真正的书的权利实例吗?看看下面的代码片段:

class Publication {  
    private: 
    string _title; 
    string _author; 
    Genre _genre; 

    public: 
    void check_out(string patron_name, string patron_phone); 
    void check_in(); 
    bool is_checked_out() const; 

    string to_string() const; 
    string get_title() const { return _title; } 
    string get_author() const { return _author; } 
    const Genre& get_genre() const { return _genre; } 


    Publication(string author, string title, Genre genre) : _author(auth), _title(title), _genre(genre) 
    { } 
}; 
+0

我做了同样的事情。我使用setter和getters来获得私有变量。我的问题是如何操纵流派,媒体和年龄,如果他们是在发布课的私人部分的类对象? –

+0

封装的一点是,你不希望它们被操纵......否则使它们公开,不要称之为封装。在你的例子中(如果我理解正确),你没有任何理由去改变现有出版物的流派......你为什么要这样做?注意,这个''Publication'类仍然可以操作'Genre'的实例,但是外部没有人可以...这就是封装的全部... – Kupto

+0

@ Kupto好的,我理解你的观点。现在我应该如何以小说,非小说,自助和表演来实现流派。另一件令我困惑的事情。它在程序中的用途是什么? –