草庐IT

2022.01.18.类之间的横向关系

剑客夜雨声烦 2023-03-28 原文

组合:部分与整体,包含与被包含有生命周期约束关系

它是一种“is a part of”的关系(部分与整体)。组合是一个类中包含另一个类对象。相比聚合,组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象在组合对象常见的同时或者之后创建,在组合对象销毁之前销毁,一般来说,被组合对象不能脱离组合对象独立存在,整体不存在,部分一定不存在

通常在组合类中包含被组合类随想来实现组合关系

 

class CHand{
public:         
         void  move(){
                 cout<<"小手拍动" <<endl;
        }   
};
class CPeople{
public:
    CHand m_hand;
    void clap(){
        m_hand.move();
        cout<<"发出阵阵掌声"<<endl;
    }

 

依赖:完成某个功能必须用到被依赖的对象,一般当工具对待,没有生命周期约束关系

它是一种“use a”的关系,一个对象的某种行为依赖于另一个类对象,被依赖的对象为完成某个搞那个能的工具,并不持有它的引用,只有在完成某个功能时才会用到,而且是必不可少的,依赖之间是没有声明周期约束关系的

 通过长将被依赖的对象作为另一类方法的参数的形式实现两个类之间的依赖关系

class CComputer{
public:
    void Compile(){
        cout<<"正在编译。。。生成、、、可执行程序"<<endl;
    }
};
class CPeople{
public:
    void program(CComputer*pComp){
        if(pComp){
            m_hand.move();
            cout<<"噼里啪啦,敲击键盘,输入一行行代码"<<endl;
            pComp->Compile();
        }
    }

 

关联:可有可无的平等关系,没有生命周期约束

 它是一种“has a”的关系。关联不是从属关系而是平等关系,但不可占有对方,完成某个功能与被关联的对象有关,但被关联的对象可有可无。被关联的对象与管理链的对象无生命周期约束关系,被关联对象的声明周期有谁创造就谁守护。只要二者同意,就可以随时解除关系或是进行关联,被关联的对向还可以再被别的对象关联,所以关联是可以共享的。

通常在关联的类中定义被关联的对象的指针形式实现两个类之间的关联关系。

class CFriend{
public:
    void play(){
        cout<<"我的朋友正在玩耍"<<endl;;
    }
};
class CPeople{
public:
    CFriend *m_pFri;
    CPeople(){
        m_pFri=nullptr;
    }
    void playwangzhe(){
        cout<<"准备要打王者"<<endl;
        if(m_pFri){
            m_pFri->play();
            cout<<"走啊,开黑"<<endl;
            cout<<"拿下五杀"<<endl;
        }
        else {
            cout<<"自己匹配"<<endl;
            cout<<"拿下五杀"<<endl;
        }
    }
};

 

聚合:被聚合的对象组合起来(容器)

它是一种“owns a”的关系。多个悲剧和的对象聚集起来星星哼一个强大的整体聚合的目的是为了统一进行嘎UN里通过类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合的对象还可以再被别的对象关联,所以被聚合的对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系,相当于强版本的关联。

#include<iostream>
using namespace std;
class CFamily{
public:
    CPeople* peoArr[10];
    CFamily(){
        
        for(int i=0;i<10;i++){
            if(peoArr[i]){
                peoArr[i]=nullptr;
                peoArr[0] = new CPeople;
            peoArr[1] = new CPeople;
            peoArr[2] = new CPeople;
            }
        }
    }
    ~CFamily(){
        for(int i=0;i<10;i++){
            if(peoArr[i]){
                delete peoArr[i];
                peoArr[i]=nullptr;

            }
        }
    }
public:
    void AllPeopleProgram(CComputer *pComp){
    
        for(int i=0;i<10;i++){
            if(peoArr[i]){
                cout<<""<<i<<":"<<endl;
                peoArr[i]->program(pComp);
            }
        }
    }
};
int main(){
    CFamily fai;
    CComputer *pComp = new CComputer;
    fai.AllPeopleProgram(pComp);
    return 0;
}

 

有关2022.01.18.类之间的横向关系的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  6. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  7. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  8. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  9. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  10. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

随机推荐