首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 类的关系问题 讨论帖 [已结帖,结帖人:wutaozhao]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wutaozhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-04 15:51:15 楼主
    有一个类A,里面封装了Insert()、Query()和Delete()这三个成员函数,已经进行了实现,另外有十个类,分别想只使用这个类A里面的部分成员,如类B只使用Insert(),但类B又不想看见Query()和Delete(),如果用继承的话,就算设置继承方式和在类A中设置三个成员的访问权限,在子类里还是能看到所有的成员,只是不能访问了,我这里的看见是这样,比如类B,通过类B的对象只能看到Insert(),大家还有什么办法,不要觉得我这个问题弱智,^_^
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vegertar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 15:57:011楼 得分:5
    对三个友员分别设置友元
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vegertar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:05:182楼 得分:0
    汗, 是三个成员.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • macfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:14:033楼 得分:2
    想想...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • elmnd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:16:174楼 得分:2
    我没有技术,只能帮顶!
    我还没有看到继承啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kiffa
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:17:495楼 得分:5
    LZ的主要目的是想寻求一个好的设计方案,还是想寻求各种可能的实现方法?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Longinc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:18:446楼 得分:0
    设置友元应该是可以的,再想想
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mougou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:21:247楼 得分:5
    从设计上来说应该分别实现。因为通过你的描述可以看出类A跟类B之间不存在明显的逻辑关系。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wutaozhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:22:178楼 得分:0
    To EveryOne:
      这个问题不局限于继承,只要是好的设计方案,能解决问题就行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wutaozhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:24:039楼 得分:0
    To Mougou:
      如果分别实现的话,得写很多重复的代码,如果其他的类也想使用这些功能,就得重新写,问题就在这,我是想节省代码
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vegertar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:24:4310楼 得分:0
    汗死, 似乎没法为单独的方法设置友员。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wutaozhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:26:2211楼 得分:0
    To EveryOne:
        关键问题是想节省代码,能复用最好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myyihua
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:32:4312楼 得分:0
    个人看法,既然要使用基类,那么基类里面的方法应该是子类共有的,所以你这样的设计有点违背了基类的原则。
    还是觉得好好分析具体的类框架,只把共通的东西放到基类中去,不然这样的设计感觉是为了做设计而设计了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myyihua
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:35:2713楼 得分:8
    或者你可以直接换种方式,不用继承,直接使用方法调用,如:

    public BB
    {
      public:
            BB()
            {A a}
      Insert()
      {
          a.Insert();
      }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vegertar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:36:3214楼 得分:8
    这样行不行?


    C/C++ code
    #include <iostream> class S { public: static void f() { std::cout << "S::f()" << std::endl; } static void g() { std::cout << "S::g()" << std::endl; } static void h() { std::cout << "S::h()" << std::endl; } }; class A { public: void f() const { S::f(); } }; class B { public: void g() const { S::g(); } }; class C { public: void h() const { S::h(); } }; int main() { A a; a.f(); B b; b.g(); C c; c.h(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lijinfenghust
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:38:2115楼 得分:8
    另外的10个类分别包含A作为其私有成员变量。
    比如
    class B
    {
    public:
    void insert()
    {
    a.insert();
    }
    private:
    A a;
    }
    其余类似
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wutaozhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:38:5616楼 得分:0
    To myyihua:
      你的见解很好,呵呵,但我说了,这个不局限于继承,旨在求一个好的解决方案
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qhfu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:42:2917楼 得分:5
    我觉得委托 跟 适配
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:43:1418楼 得分:3
    引用 11 楼 wutaozhao 的回复:
    To EveryOne:
    关键问题是想节省代码,能复用最好

    用继承貌似实现不了
    可以看看设计模式
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xuedaoli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:44:3319楼 得分:0
    我如果没理解错的话,楼主是下面这个意思:
    类C不含有Insert()操作,所以C的对象c
    c.Insert(),这里是看不到的,也就是隐藏了函数的名字,是这样吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liguiwen95
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:45:2120楼 得分:5
    不太懂,不太理解LZ的意思,看到和看不到有什么区别呢?如果只是看而没有调用的话好像不占资源吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • devil_zuiai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:46:0721楼 得分:8
    这样可否?
    C/C++ code
    class B; class A { private: void del(){} void mod(){} void ins(){} friend class B; }; class B : public A { public: void del() { A::del(); } void mod() { A::mod(); } }; int main() { B b; b.del();//可行 b.mod();//可行 b.ins();//报错 return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luansxx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:47:4222楼 得分:8
    class B : private A
    {
    public:
        using A::Insert;
    };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xuedaoli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:48:3323楼 得分:5
    如果说想隐藏函数名的话,是比较高档了,至少要知道编译器是如何判断当前的函数对于某个对象是否看的见。
    等高手~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:50:5824楼 得分:5
    有一个类A,里面封装了Insert()、Query()和Delete()这三个成员函数,已经进行了实现,另外有十个类,分别想
    只使用这个类A里面的部分成员,如类B只使用Insert(),但类B又不想看见Query()和Delete()

    类B中使用什么函数可以控制 ,但是要让B看到一部分  一部分又看不到  只能设置访问权限了 但是这样一来
    就偏离了本意了(因为你有十个类而且使用不同)
    你可以自定义同名函数屏蔽掉其他不想看到的函数(但是代码量不减反增)    所以你说的看到一部分另一部分看不到是难以实现的  可能是你表述有误
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lijinfenghust
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:51:5025楼 得分:3
    编译器判断函数对某个对象是否可见 那是  编译时就确定了。这个应该没啥难度把。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:52:4926楼 得分:0
    引用 22 楼 luansxx 的回复:
    class B : private A
    {
    public:
    using A::Insert;
    };


    嗯  这方法不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangfan1981
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:54:1627楼 得分:5
    头一次听说这种需求。

    把类A改造一下。

    类A中仅保留必要的成员。

    把Insert()、Query()和Delete()放到它的子类中去。如A1、A2、A3。类B根据需要使用A的子类。

    何必搞得那马麻烦。这样改的工作量应该不是很大吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taodm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      3

    发表于:2008-11-04 16:54:3628楼 得分:0
    不要试图用语言的内部机制来完全取代项目的团队合作。
    写一个使用说明就足够了,不必简单问题复杂化。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lijinfenghust
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-04 16:55:0829楼 得分:0
    引用 15 楼 lijinfenghust 的回复:
    另外的10个类分别包含A作为其私有成员变量。
    比如
    class B
    {
    public:
    void insert()
    {
    a.insert();
    }
    private:
    A a;
    }
    其余类似

    我觉得我这样很好。至少在VC开发环境中被屏蔽的函数连提示都不会有。如果用私有继承,最起码会有提示。
    呵呵。
    修改 删除 举报 引用 回复