Лабораторная работа №2. Агрегация по значению и вложением. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №2. Агрегация по значению и вложением.



Агрегация по значению.

 
                 

рис.2. Диаграмма классов: агрегация по значению.

 


                                                                                         ось объектов

 

 

 


Текст программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace lab2_AgregationAtt

{

class Program

{

   class A

   {

       public A() { c.c1 = 40; }

       ~A() { }

 

       public void mA() { Console.WriteLine("method of A"); }

 

       public B bA { get { Console.Write("get b ->"); return b; } }

       public C cA { get { Console.Write("get c ->"); return c; } }

 

       private B b = new B();

       private C c = new C();

   }

 

   class B

   {

       public B() { }

       ~B() { }

       public void mB() { Console.WriteLine("method of B"); }

 

       public D dA { get { Console.Write("get d ->"); return d; } }

 

       private D d = new D();

 

   }

 

   class C

   {

       public C() { this.c1 = 15; }

       ~C() { }

 

       public void mC() { Console.WriteLine("method of C"); }

 

       public E eA { get { Console.Write("get e ->"); return e; } }

       public J jA { get { Console.Write("get j ->"); return j; } }

 

       private E e = new E();

       private J j = new J();

 

       public int c1 { get; set; }

   }

 

   class D

   {

       public D() { }

       ~D() { }

       public void mD() { Console.WriteLine("method of D"); }

   }

 

   class E

   {

       public E() { }

       ~E() { }

       public void mE() { Console.WriteLine("method of E"); }

   }

 

   class J

   {

       public J() { this.c1 = 20; }

   ~J() { }

       public void mJ() { Console.WriteLine("method of J"); }

 

       public K kA { get { Console.Write("get k ->"); return k; } }

       private K k = new K();

       public int c1 { get; set; }

   }

 

   class K

   {

       public K() { }

       ~K() { }

       public void mK() { Console.WriteLine("method of K"); }

   }

 

   static void Main(string[] args)

   {

       A a = new A();

       //вкладываем в a

       a.mA();

       a.bA.mB();

       a.cA.mC();

 

       //вкладываем в a -> b - >

       a.bA.dA.mD();

 

       //вкладываем в a -> c - > e & a -> c ->f

       a.cA.eA.mE();

       a.cA.jA.mJ();

 

       a.cA.jA.kA.mK();

 

       Console.ReadKey();

   }

}

}

Результат работы программы:

Вывод: при агрегации по значению все объекты класса существуют внутри объявленного класса. При таком виде агрегации невозможно удалить объекты, являющиеся частью объекта первого по иерархии класса. Например, b, c, j, k — части объекта а класса А(первый класс по иерархии); эти части создаются только при вызове конструктора класса A, а уничтожаются — при вызове деструктора А.

 

Агрегация вложением.

Текст программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace lab2_AgregationVal

{

       class Program

       {

   class A

   {

   public A() { c.c1 = 5; }

   ~A() { }

 

   public class B

   {

              public B() { }

              ~B() { }

 

              public class D

              {

              public D() { }

              ~D() { }

              public void mD() { Console.WriteLine(" method of D"); }

              }

 

              public void mB() { Console.WriteLine(" method of B"); }

              public D dA { get { Console.Write("get d -> "); return d; } }

 

              private D d = new D();

   }

 

   public class C

   {

              public C() { this.c1 = 10; }

              ~C() { }

              public class E

              {

              public E() { }

              ~E() { }

              public void mE() { Console.WriteLine(" method of E"); }

              }

 

              public class F

              {

              public F() { }

              ~F() { }

              public void mF() { Console.WriteLine(" method of F"); }

              }

 

              public void mC() { Console.WriteLine(" method of C"); }

              public E eA { get { Console.Write("get e ->"); return e; } }

              public F fA { get { Console.Write("get f ->"); return f; } }

 

              private E e = new E();

              private F f = new F();

 

              public int c1 { set; get; }

   }

 

   public class J

   {

              public J() { }

              ~J() { }

              public void mJ() { Console.WriteLine(" method of J"); }

   }

 

   public class K

   {

              public K() { }

              ~K() { }

              public void mK() { Console.WriteLine(" method of K"); }

   }

   public void mA() { Console.WriteLine(" method of A"); }

 

   public B bA { get { Console.Write("get b ->"); return b; } }

   public C cA { get { Console.Write("get c ->"); return c; } }

   public J jA { get { Console.Write("get j ->"); return j; } }

   public K kA { get { Console.Write("get k ->"); return k; } }

 

   private B b = new B();

   private C c = new C();

   private J j = new J();

   private K k = new K();

 

   }

   static void Main(string[] args)

   {

   //Создаем объект класса-родителя A

   A a = new A();

 

   //Проводим агрегацию по значению

   a.mA();

   //агрегируем в A: B, C, J, K

   a.bA.mB();

   a.cA.mC();

   a.jA.mJ();

   a.kA.mK();

 

   //агрегируем в B: D

   a.bA.dA.mD();

 

   //агрегируем в C: E, F

   a.cA.eA.mE();

   a.cA.fA.mF();

 

   Console.ReadKey();

   }

       }

}

Результат работы программы:

Вывод: при агрегации вложением определение классов происходит внутри классов, стоящих выше по иерархии. Все объекты создаваемого класса существуют внутри него самого. Как и в случае агрегации по значению уничтожение объектов, невозможно без уничтожения класса, стоящего выше по иерархии. Агрегация по ссылке намного лучше агрегации по значению или вложению, так как агрегация по ссылке расходует меньше памяти.



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 288; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.107.90 (0.029 с.)