Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Shape class (shape.rb & shape.py)



Shape class (shape.rb & shape.py)

Задача.

На основі базового класу фігура, в якому визначені атрибути її положення (координати фігур) і операції над ними побудувати класи прямокутник і коло, доповнивши їх властивими їм атрибутами і методами та віртуальним методом прорисовки.

Створити масив об’єктів різних класів і в одному циклі видати їх характеристики (демонстрація поліморфності методів)

Задачу реалізувати на Пайтоні і Рубі.

# Базовий пайтонівський клас class Shape: # конструктор базового класу з атрибутами координат def __init__(self, x, y): # при створенні екземпляра класу встановлюються # значення його атрибутів self.x,self.y = x,y # методи доступу до атрибутів x & y def getX: return self.x def getY: return self.x # установкка нових значень атрибутів def setX(newx): self.x = newx def setY(newy): self.y = newy # метод переміщення в нову точку def move_to(self, x, y): self.x,self.y = x,y # метод зміщення в нову точку def move_by(self, dx, dy): self.x,self.y = (self.x+dx),(self.y+dy) # абстрактний метод (конкретизується в нащадках) def draw(self): pass
# клас прямокутників, похідний від Shape class Rectangle(Shape): # конструктор прямокутників def __init__(self, x, y, width, height): # конструктор базового класу Shape.__init__(self, x, y) self.w,self.h = width,height # перекриття методу прорисовки def draw(self): print'Drawing a Rectangle at: %3d,%3d w %3d h / %3d' %(self.x,self.y,self.w,self.h)
# клас кіл, похідний від Shape class Circle(Shape): # конструктор def __init__(self, x, y, r): Shape.__init__(self,x,y) self.r = r def draw(self): print 'Drawing a Circle at: %3d,%3d radius %3d' % (self.x,self.y,self.r)
# головна процедура (створює масив різних об’єктів) def run(): scribble=[Rectangle(10, 20, 5, 6), Circle(15, 25, 8)] # і поліморфно їх обробляє for shape in scribble: shape.draw() shape.move_by(100, 100) shape.draw() # те ж саме, але з одиночним об’єктом rect = Rectangle(0, 0, 15, 15) rect.w = 30 rect.draw() # виклик головної процедуриif __name__=='__main__': run()

Реалізація програми на С#

using System; // Ресурси об’єднані в простір імен Polymorph namespace Polymorph { // декларація базового абстрактного класу public abstract class Shape { // атрибути об’єктів класу, що визначають положення private int x; private int y; // конструктор (установлює координати положення при створенні) public Shape(int newx, int newy) { setX(newx); setY(newy); } // Методи доступу до координат x & y public int getX() { return x; } public int getY() { return y; } public void setX(int newx) { x = newx; } public void setY(int newx) { y = newx; } // метод переміщення об’єкту в положення newx, newy public void moveTo(int newx, int newy) { setX(newx); setY(newy); } // метод зміщення (deltax,deltay) об’єкту відносно старого положення public void rMoveTo(int deltax, int deltay) { moveTo(deltax + getX(), deltay + getY()); } // віртуальний абстрактний метод (визначається нащадками) public abstract void draw(); }}

Прямокутники

using System; // клас прямокутників, похідний від shape, включається в один простір імен із shape namespace Polymorph { public class Rectangle: Shape { // додаємо атрибути, властиві тільки прямокутнику private int width; private int height; // конструктор (при створенні об’єктів задаються і власні, і успадковані параметри) // атрибути базового класу визначаються викликом конструктора: base(newx, newy) public Rectangle(int newx, int newy, int newwidth, int newheight): base(newx, newy) { setWidth(newwidth); setHeight(newheight); } // методи доступу до власних атрибутів прямокутника width & height public int getWidth() { return width; } public int getHeight() { return height; } // відгадайте, чим наступні методи відрізняються від попередніх public void setWidth(int newwidth) { width = newwidth; } public void setHeight(int newheight) { height = newheight; } // імітація метода draw прорисовки об’єкта (перекриття) public override void draw() { Console.WriteLine("Drawing a Rectangle at:({0},{1}), Width {2}, Height {3}", getX(), getY(), getWidth(), getHeight()); } }}

Коло



using System; namespace Polymorph { public class Circle: Shape { private int radius; // конструктор public Circle(int newx, int newy, int newradius): base(newx, newy) { setRadius(newradius); } // методи доступа до змінної radius public int getRadius() { return radius; } public void setRadius(int newradius) { radius = newradius; } // імітація метода draw прорисовки об’єкта public override void draw() { Console.WriteLine("Drawing a Circle at:({0},{1}), Radius {2}", getX(), getY(), getRadius()); } }}

Демонстрація поліморфізму (polymorph.cs)

(У головній програмі створено масив об’єктів базового класу, куди поміщені об’єкти різних класів з одним і тим же іменем методу прорисовки)

using System; namespace Polymorph { // декларація класу, що містить головний метод Main class Polymorph { static void Main(string[] args) { // scribble – масив із 2 елементів класу Shape Shape[] scribble = new Shape[2]; // ізольований прямокутник Rectangle rect; // екземпляри похідних класів сумісні із базовим scribble[0] = new Rectangle(10, 20, 5, 6); scribble[1] = new Circle(15, 25, 8); // один цикл за елементами різного класу (поліморфізм методів) for (int i = 0; i < scribble.Length; i++) { scribble[i].draw(); scribble[i].rMoveTo(100, 100); scribble[i].draw(); } // а це – використання ізольованого об’єкту rect = new Rectangle(0, 0, 15, 15); rect.setWidth(30); rect.draw(); } }}

Результати

Drawing a Rectangle at:(10,20), Width 5, Height 6Drawing a Rectangle at:(110,120), Width 5, Height 6Drawing a Circle at:(15,25), Radius 8Drawing a Circle at:(115,125), Radius 8Drawing a Rectangle at:(0,0), Width 30, Height 15

 


Дата добавления: 2015-11-04; просмотров: 20 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
№ 2 Жалпы дәрігерлік тәжірибе кафедрасының ЖДТ-интерн студенттеріне «Жалпы дәрігерлік тәжірибе» пәні бойынша межелік бақылау тесті | 1. Көкеттік нерв қандай өрімнің тармағы болып табылады?

mybiblioteka.su - 2015-2024 год. (0.009 сек.)