Наследование time time_with_sec В чем преимущества наследования? Наследование кода – поля, метод inc Появилось два класса с которыми точно можно обращаться одинаково – inc(), print() – Наследование интерфейса
Пример void f(time t) { t.print(); t.inc(); t.print(); } time t = new time(8, 30); f(t); time t1 = new time_with_sec(8, 40, 15); f(t1); Мы можем писать код, который работает для разных типов (и для time и для time_with_sec) Называется полиморфизм Это главное зачем нужно наследование Это благодаря виртуальным функциям
Еще пример time [] a = new time [10]; a[0] = new time(8, 30); a[1] = new time_with_sec (8, 40, 15); … for (int i=0; i
Фигуры Фигура – Ромб – Круг – Треугольник abstract class Shape { protected int x, y; public abstract double area(); public abstract double perim(); class Rhomb: Shape { методы для площади и периметра } class Circle: Shape { методы для площади и периметра }
Абстрактные классы и методы abstract метод – его надо переопределить (А virtual метод – его можно переопределить) abstract класс – у него надо определить производный класс Нельзя создать обьект абстрактного класса object – базовый класс для всех обьектов
Интерфейсы примерно: абстрактный класс, в котором есть только абстрактные методы и больше ничего public interface IShape { double Area(); double Perim(); } abstract и public как бы добавляются автоматически class Rhomb : IShape { …
Зачем интерфейсы? Зачем интерфейсы, если есть абстрактные классы? Множественное наследование Car - автомобиль Ship – корабль Amphibia : Car, Ship – так нельзя.. Если автомобтль и корабль – интерфейсы - ОК
Создание обьектов и полиморфный код может ли конструктор быть виртуальным? – нет… конструктор не может вызываться в полиморфном коде. А иногда все-таки хочется создать код, который – полиморфный – все-таки создает обьекты Пример IShape [] a = new IShape[10]; Задача – скопировать в массив b. Но мы не знаем, что там находиться! Как вызывать new?
clone public interface IShape { double Area(); double Perim(); IShape Clone(); } class Rhomb : IShape { public IShape Clone() { return new Rhomb(x, y, h, w); } это шаблон Prototype