Sprint.h - Заголовочный файл производного класса
Понятие пакета package в java
В современных ООП языках используется только открытое наследование
4) Множественное наследование
В C++ класс может быть наследником нескольких классов.
class Record
{
public:
..........
protected:
int min,sec;
...........
}
class Person
{
public:
..........
protected:
char Fam[30];
int Vozrast;
.............
}
class Sportsman: public Person, public Record
{
public:
..........
private:
int Category;
............
}
В классе Sportsman наследуются поля min, sec, Fam,Vozrast.
Пусть в классе Person имеется поле double min.
class Person
{
public:
..........
protected:
char Fam[30];
int Vozrast;
double min;
.............
}
void Sportsman::Putmin(int m)
{
min=m; // какое min из двух??
......
}
Решение – указывать явно класс. Person::min=m;
В современных языках множественное наследование отсутствует!
5) Наследование на языке java
Наследуемый класс – подкласс (subclass), класс от которого наследуется – суперкласс (superclass).
Смысл prrotected такой же.
Вариант программы с дополнительным классом для задания main.
class Record // это суперкласс
{
protected int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public int Numbersec()
{
return min*60+sec;
}
}
class Sprint extends Record // extends наследует (расширяет) – это подкласс
{
private int dec;
public void Putdec(int d)
{
dec=d;
}
public int Numberdec()
{
int k;
k=min*60+sec;
return k*10+dec;
}
}
public class WorkSport // класс для main public!
{
public static void main (String args[])
{
int p;
Record a=new Record(); // объект Record
a.Init(2, 40);
p=a.Numbersec();
System.out.printf("%d\n ", p);
Sprint b=new Sprint(); // объект Sprint
b.Init(1, 10); // вызов наследуемого метода; b.min=5; - ошибка!
b.Putdec(6);
p=b.Numberdec();
System.out.printf("%d\n ", p);
}
}
На консоли:
WorkSport содержит единственный метод main. Файл с тремя классами: WorkSport.java!!
На C++ размещение файлов в интегрированных средах (не консольное приложение):
1. Record.h – заголовочный файл базового класса
class Record
{
public:
void Init (int m,int s);
int Numbersec();
protected: // вместо private:
int min;
int sec;
};
2. Record.cpp – файл с методами базового класса
int Record::Numbersec()
{
return min*60+sec;
}
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
class Sprint: public Record // Sprint-наследник Record
{
public:
// новые методы Sprint
void Putdec(int d);
int Numberdec();
private:
// новое поле Sprint
int dec;
};
4. Sprint.cpp – файл с методами производного класса
void Sprint::Putdec(int d)
{
dec=d;
}
int Sprint::Numberdec()
{
int k;
k=Numbersec();
return k*10+dec;
}
5. lab4.cpp – основной файл с функцией main
int main(int argc, char* argv[])
{
int m,n;
Record x,y;
Sprint z;
.......
}
Пакет на java позволяет разнести классы по отдельным файлам и обеспечить связь между полями и методами различных классов. Пакет – отдельный каталог, в котором размещается несколько файлов – public классов.
Пример создания пакета
Создание проекта: file – new – java project (lab4)
Создание пакета: file – new – Package (sports)
Создание отдельных 3 файлов-public классов
file - new – class
package sports;
public class Record
{
protected int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public int Numbersec()
{
return min*60+sec;
}
}
file - new – class
package sports;
public class Sprint extends Record
{
private int dec;
public void Putdec(int d)
{
dec=d;
}
public int Numberdec()
{
int k;
k=min*60+sec;
return k*10+dec;
}
}
file - new – class
package sports;
public class worksport
{
public static void main (String args[])
{
int p;
Record a=new Record();
a.Init(2, 40);
p=a.Numbersec();
System.out.printf("%d\n ", p);
Sprint b=new Sprint();
b.Init(1, 10);
b.Putdec(6);
p=b.Numberdec();
System.out.printf("%d\n ", p);
}
}
Размещение:
lab4\\src\\sports\\
6) Перегрузка методов и явное указание класса вызываемого метода
Возможна перегрузка метода из базового класса в производном классе.
Пример – переопределение Init в Sprint
class Record
{
public:
void Init (int m,int s);
protected:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
class Sprint: public Record
{
public:
void Init(int m,int s, int d);
private:
int dec;
};
// перегрузка
void Sprint::Init(int m,int s, int d)
{
min=m;
sec=s;
dec=d;
}
int main(int argc, char* argv[])
{
int m,n;
Record x;
x.Init(4,36); // min=4 sec=36
Sprint z;
z.Init(1,8,6); // min=1 sec=8 dec=6
}
Init(int m,int s,int d) в Sprint перекрывает наследуемый метод Init(int m,int s) в Record, не работает:
int main(int argc, char* argv[])
{
Sprint z;
z.Init(1,8); // неправильное число аргументов
.........
Для вызова метода другого класса явно указывается принадлежность этому классу.
z.Record::Init(5,8); // min=5 sec=8 dec не определено
Вариант Init класса Sprint с вызовом Init базового класса.
void Sprint::Init(int m,int s, int d)
{
Record::Init(m,s); // вызов метода из другого класса
dec=d;
}
Возможна перегрузка метода в производном классе с такими же параметрами как в базовом классе.
Добавлен метод:
void Sprint::Init(int m,int s)
{
min=m;
sec=s;
dec=1;
}
int main(int argc, char* argv[])
{
Sprint z;
z.Init(1,8,6); // min=1 sec=8 dec=6
z.Init(1,8); // вызов второго метода
Перегрузка методов производного класса в java
class Record
{
protected int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
}
class Sprint extends Record
{
private int dec;
public void Putdec(int d)
{
dec=d;
}
public void Init(int m,int s,int d)
{
min=m;
sec=s;
dec=d;
}
}
public class WorkSport
{
public static void main (String args[])
{
int p;
Record a=new Record();
a.Init(2, 40);
System.out.printf("%d\n ", p);
Sprint b=new Sprint();
b.Init(1, 10,5);
p=b.Numberdec();
System.out.printf("%d\n ", p);
}
}
В java перегруженный метод Init(int m,int s,int d) в Sprint не перекрывает наследуемый метод Init(int m,int s) из Record
Sprint b=new Sprint();
b.Init(1, 10,5);
Sprint с=new Sprint();
с.Init(2, 15); // вызов наследуемой функции из Record
Вариант Init класса Sprint с вызовом наследуемого метода из Record
public void Init(int m,int s,int d)
{
Init(m,s); // вызов наследуемого метода
// min=m;
// sec=s;
dec=d;
}
7) Конструкторы в производных классах
Конструкторы не наследуются. Правила работы с конструкторами производного класса.
Если в базовом классе есть конструктор без параметров, при создании объектов производного класса сначала вызывается конструктор базового класса.