Создание новых объектов

912 views

Published on

Лекция Михаила Гуренкова по созданию новых объектов в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
912
On SlideShare
0
From Embeds
0
Number of Embeds
258
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Создание новых объектов

  1. 1. Создание новых объектов: композиция, наследование, делегирование
  2. 2. Композиция <ul><li>template<class _Ty, class _Container = deque<_Ty> > </li></ul><ul><li>class stack </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>… </li></ul><ul><li>size_type size() const reference top() </li></ul><ul><li>{ // return last element of mutable stack </li></ul><ul><li>return (c.back()); </li></ul><ul><li>} </li></ul><ul><li>const_reference top() const </li></ul><ul><li>{ // return last element of nonmutable stack </li></ul><ul><li>return (c.back()); </li></ul><ul><li>} </li></ul><ul><li>void push(const value_type& _Val) </li></ul><ul><li>{ // insert element at end </li></ul><ul><li>c.push_back(_Val); </li></ul><ul><li>} </li></ul><ul><li>void pop() </li></ul><ul><li>{ // erase last element </li></ul><ul><li>c.pop_back(); </li></ul><ul><li>} </li></ul><ul><li>protected: </li></ul><ul><li>_Container c; // the underlying container </li></ul><ul><li>}; </li></ul>
  3. 3. Композиция <ul><li>class Engine { </li></ul><ul><li>public void start() {} </li></ul><ul><li>public void rev() {} </li></ul><ul><li>public void stop() {} </li></ul><ul><li>} </li></ul><ul><li>class Wheel { </li></ul><ul><li>public void inflate(int psi) {} </li></ul><ul><li>} </li></ul><ul><li>class Window { </li></ul><ul><li>public void rollup() {} </li></ul><ul><li>public void rolldown() {} </li></ul><ul><li>} </li></ul><ul><li>class Door { </li></ul><ul><li>public Window window = new Window(); </li></ul><ul><li>public void open() {} </li></ul><ul><li>public void close() {} </li></ul><ul><li>} </li></ul><ul><li>public class Car </li></ul><ul><li>{ </li></ul><ul><li>public Engine engine = new Engine(); </li></ul><ul><li>public Wheel[] wheel = new Wheel[4]; </li></ul><ul><li>public Door left = new Door(), </li></ul><ul><li>p ublic Door right = new Door(); </li></ul><ul><li>public Car() </li></ul><ul><li>{ </li></ul><ul><li>for(int i = 0; i < 4; i++) </li></ul><ul><li>wheel[i] = new Wheel(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>public static void main(String[] args) </li></ul><ul><li>{ </li></ul><ul><li>Car car = new Car(); </li></ul><ul><li>car.left.window.rollup(); </li></ul><ul><li>car.wheel[0].inflate(72); </li></ul><ul><li>} </li></ul>
  4. 4. Композиция <ul><li>public class XOnlineListener : XListener </li></ul><ul><li>{ </li></ul><ul><li>XParser m_Parser; </li></ul><ul><li>IReader m_Reader; </li></ul><ul><li>public XOnlineListener(string a_ListenerName, IReader a_Reader, XParser a_Parser) : base(a_ListenerName) </li></ul><ul><li>{ </li></ul><ul><li>m_Parser = a_Parser; </li></ul><ul><li>m_Reader = a_Reader; </li></ul><ul><li>} </li></ul><ul><li>protected override void ListenerLoop() </li></ul><ul><li>{ </li></ul><ul><li>List<XCallInformation> calls = new List<XCallInformation>(); </li></ul><ul><li>foreach (XBillingString billingString in m_Reader.Read()) </li></ul><ul><li>{ </li></ul><ul><li> XCallInformation info = m_Parser.ParseAndProcess(billingString); </li></ul><ul><li> if (info == null) </li></ul><ul><li> { </li></ul><ul><li> continue; </li></ul><ul><li> } </li></ul><ul><li> calls.Add(info); </li></ul><ul><li>} </li></ul><ul><li>XBilling.RegisterCall(calls); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  5. 5. Композиция <ul><li>XListenerPool.Instance.AddListener( </li></ul><ul><li>new XOnlineListener(&quot;Unitel&quot;, new XComReader(&quot;Unitel&quot;, ConfigurationManager.AppSettings[&quot;UnitelPort&quot;]), new XUnitelParser())); </li></ul><ul><li>XListenerPool.Instance.AddListener(new XOnlineListener(&quot;DX&quot;, new XIncrementFileReader(&quot;DX&quot;, ConfigurationManager.AppSettings[&quot; D xFile&quot;]), new XDxParser())); </li></ul><ul><li>XListenerPool.Instance.AddListener(new XFileListener(&quot;Unitel Backup&quot;, &quot;UnitelBackup&quot;, new XBackupProcessor(&quot;Unitel&quot;, new XUnitelParser()))); </li></ul><ul><li>XListenerPool.Instance.AddListener(new XFileListener(&quot;DX Backup&quot;, &quot;DXBackup&quot;, new XBackupProcessor(&quot;DX&quot;, new XDxParser()))); </li></ul><ul><li>XListenerPool.Instance.AddListener(new XFileListener(&quot;IP&quot;, &quot;IP&quot;, new XIpProcessor())); </li></ul>
  6. 6. Наследование <ul><li>class A </li></ul><ul><li>{ </li></ul><ul><li>public void DoSomething(); </li></ul><ul><li>} </li></ul><ul><li>class B : A </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>A a = new A(); </li></ul><ul><li>A a1 = new B(); </li></ul><ul><li>B b = new B(); </li></ul>
  7. 7. Наследование <ul><li>class A </li></ul><ul><li>{ </li></ul><ul><li>public virtual void DoSomething(); </li></ul><ul><li>} </li></ul><ul><li>class B : A </li></ul><ul><li>{ </li></ul><ul><li>public override void DoSomething(); </li></ul><ul><li>} </li></ul><ul><li>A a = new A(); </li></ul><ul><li>A a1 = new B(); </li></ul><ul><li>B b = new B(); </li></ul><ul><li>a.DoSomething(); </li></ul><ul><li>a1.DoSomething(); </li></ul><ul><li>b.DoSomething(); </li></ul>
  8. 8. Наследование <ul><li>Пример про велосипеды </li></ul>
  9. 9. Особенности наследования
  10. 10. Полиморфизм
  11. 11. Виды наследования <ul><li>1. Расширение существующего класса </li></ul>
  12. 12. 2. Наследование от интерфейса <ul><li>public interface IReader </li></ul><ul><li>{ </li></ul><ul><li>ICollection<XBillingString> Read(); </li></ul><ul><li>void Start(); </li></ul><ul><li>v oid Stop(); </li></ul><ul><li>} </li></ul><ul><li>public class XComReader : IReader </li></ul><ul><li>{ </li></ul><ul><li>SerialPort m_Port = null; </li></ul><ul><li>string m_PortName; </li></ul><ul><li>public XComReader(string a_PortName) </li></ul><ul><li>{ </li></ul><ul><li> m_PortName = a_PortName; </li></ul><ul><li>} </li></ul><ul><li>#region IReader Members </li></ul><ul><li>public void Start() { … } </li></ul><ul><li>public void Stop() { … } </li></ul><ul><li>public ICollection<XBillingString> Read() </li></ul><ul><li>{ </li></ul><ul><li>lock (m_Port) </li></ul><ul><li>{ </li></ul><ul><li>if (!m_Port.IsOpen) </li></ul><ul><li>{ </li></ul><ul><li>return new XBillingString[0]; </li></ul><ul><li>} </li></ul><ul><li>return new XBillingString[] { new XBillingString(m_Port.ReadLine()) }; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>#endregion </li></ul><ul><li>} </li></ul>
  13. 13. 3. Наследование от базового класса (абстрактного класса) <ul><li>abstract public class XParser </li></ul><ul><li>{ </li></ul><ul><li>protected XParser() </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>public string ParserName </li></ul><ul><li>{ </li></ul><ul><li>get { return GetType().Name; } </li></ul><ul><li>} </li></ul><ul><li>public static XParser Create(string a_ParserName) { ... } </li></ul><ul><li>public XCallInformation ParseAndProcess(XBillingString a_BillingString) </li></ul><ul><li>{ </li></ul><ul><li>a_BillingString.SetParser(this); </li></ul><ul><li>XCallInformation result = DoParse(a_BillingString); </li></ul><ul><li>if (result == null) </li></ul><ul><li>{ </li></ul><ul><li>XBilling.RegisterError(a_BillingString); </li></ul><ul><li>} </li></ul><ul><li>return result; </li></ul><ul><li>} </li></ul><ul><li>public XCallInformation Parse(XBillingString a_BillingString) </li></ul><ul><li>{ </li></ul><ul><li>a_BillingString.SetParser(this); </li></ul><ul><li>return DoParse(a_BillingString); </li></ul><ul><li>} </li></ul><ul><li>protected abstract XCallInformation DoParse(XBillingString a_BillingString); </li></ul><ul><li>} </li></ul>
  14. 14. <ul><li>public class XUnitelParser : XParser </li></ul><ul><li>{ </li></ul><ul><li>public XUnitelParser() : base() </li></ul><ul><li>{ </li></ul><ul><li>} </li></ul><ul><li>protected override XCallInformation DoParse(XBillingString a_BillingString) </li></ul><ul><li>{ </li></ul><ul><li>Regex parser = new Regex(@&quot;^[ ]*-[0-9]+[ ]*(([0-9]+).([0-9]+)) ([0-9]*)[ ]*([0-9]+)[ ]*(([0-9]+).([0-9]+)) ([0-9]+).([0-9]+).([0-9]+) ([0-9]+):([0-9]+):([0-9]+) ([0-9]+)[ ]*$&quot;); </li></ul><ul><li>Match match = parser.Match(a_BillingString.BillingString.Trim()); </li></ul><ul><li>if (!match.Success) </li></ul><ul><li>{ </li></ul><ul><li>return null; </li></ul><ul><li>} </li></ul><ul><li>return new XCallInformation( </li></ul><ul><li>ParserName, </li></ul><ul><li>match.Groups[3].Value, </li></ul><ul><li>match.Groups[4].Value, </li></ul><ul><li>int.Parse(match.Groups[1].Value), </li></ul><ul><li>int.Parse(match.Groups[2].Value) - 600, </li></ul><ul><li>int.Parse(match.Groups[5].Value), </li></ul><ul><li>int.Parse(match.Groups[6].Value) - 600, </li></ul><ul><li>int.Parse(match.Groups[13].Value), </li></ul><ul><li>new DateTime( </li></ul><ul><li>2000 + int.Parse(match.Groups[9].Value), </li></ul><ul><li>int.Parse(match.Groups[8].Value), </li></ul><ul><li>int.Parse(match.Groups[7].Value), </li></ul><ul><li>int.Parse(match.Groups[10].Value), </li></ul><ul><li>int.Parse(match.Groups[11].Value), </li></ul><ul><li>int.Parse(match.Groups[12].Value)), </li></ul><ul><li>a_BillingString </li></ul><ul><li>); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  15. 15. 4. Создание иерархии наследования
  16. 16. Делегирование
  17. 17. Заключение

×