Record.java sprint.java worksport.java

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) Конструкторы в производных классах

Конструкторы не наследуются. Правила работы с конструкторами производного класса.

Если в базовом классе есть конструктор без параметров, при создании объектов производного класса сначала вызывается конструктор базового класса.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: