Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Progi / Lesson 6 / lec6.doc
Скачиваний:
30
Добавлен:
28.03.2015
Размер:
342.53 Кб
Скачать

6. Если в базовом классе есть конструктор с параметрами, в производном классе должен быть с параметрами и базовый конструктор должен быть явно вызван.

C++

class Record

{

private:

int min,sec;

public:

Record(int m,int s);

.........

};

Record::Record(int m,int s) // конструктор с параметрами базового класса

{

min=m;

sec=s;

}

class Sprint : public Record

{

private:

int dec;

public:

Sprint(int int m,int s,int d); // конструктор с параметрами производного класса

........

};

Sprint::Sprint(int m,int s,int d) :Record(m,s) // явный вызов базового конструктора

{

dec=d;

}

int main(int argc, char* argv[])

{

Record x(1,4); // min=1 sec=4

Sprintz(2,3,5);// min=2 sec=3 dec=5 сначала вызов базового

}

Если записать без вызова базового конструктора:

Sprint::Sprint(int m,int s,int d)

{ // ошибка, нет в Record конструктора по умолчанию

min=m;

sec=s;

dec=d;

}

Java

package javaapplication13;

class Record

{

private int min,sec;

publicRecord(intm,ints)// конструктор с параметрами базового класса

{

min=m;

sec=s;

}

}

class Sprint extends Record

{

private int dec;

publicSprint(intm,ints,intd)// конструктор с параметрами производного класса

{

super(m,s);

dec=d;

}

}

public class WorkSport

{

public static void main(String[] args)

{

Record a=new Record(2,15);

Sprintb=newSprint(3,20,6);// сначала вызов конструктора базового класса

}

}

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Record

{

private int min, sec;

public Record(int m, int s) // конструктор с параметрами базового класса

{

min = m;

sec = s;

}

}

class Sprint : Record

{

private int dec;

public Sprint(int m, int s, int d):base(m,s) // конструктор с параметрами производного

// класса и явный вызов конструктора базового класса

{

dec = d;

}

}

class Program

{

static void Main(string[] args)

{

Record a = new Record(3, 30);

Sprint b = new Sprint(2, 15, 6); // сначала вызывается конструктор базового класса

}

}

}

12) Интерфейсы на Java и C# Клонирование объектов

Проект Java

Файл - создать проект - java

Создать главный класс

sports.WorkSport

Пакет (папка sports) , в папке sports файл с public классом WorkSport.java

Файл -- создать файл

Имя класса

Record

В папке sports файл с public классом Record.java

Файл -- создать файл

Имя класса

Sprint

В папке sports файл с public классом Sprint.java

Файл WorkSport.java

package sports;

public class WorkSport

{

public static void main(String[] args)

{

Record a=new Record();

a.Init(3, 10);

Sprint b=new Sprint();

b.Init(4, 12,8);

}

}

Файл Record.java

package sports;

public class Record

{

protected int min,sec;

public void Init(int m,int s)

{

min=m;

sec=s;

}

}

Файл Sprint.java

package sports;

public class Sprint extends Record

{

private int dec;

public void Init(int m,int s,int d) // перегруженный метод

{

min=m;

sec=s;

dec=d;

}

}

В интерфейсах (interface) указывается набор методов, которые должны быть реализованы в классах без всякого указания как это делать. Каждый класс, реализующий интерфейс, использует собственный метод. Класс может реализовать несколько интерфейсов в отличие от наследования с одним суперклассом.

Файл - Создать файл - Интерфейс Java

Имя класса - Calculate

Calculate.java

package sports;

interface Calculate // интерфейс доступен только для классов пакета sports

// public interface Calculate доступ для любых классов

{

int Numbersec(); // метод для классов, реализующих интерфейс

}

Реализация интерфейса в классах Record и Sprint

Record.java

package sports;

public class Record

implements Calculate // реализация интерфейса Calculate

// implements Calculate, Calculate2 - если несколько интерфейсов

{

protected int min,sec;

public int Numbersec() // метод, реализованный в интерфейсе

{

return min*60+sec;

}

public void Init(int m,int s)

{

min=m;

sec=s;

}

}

Sprint.java

package sports;

public class Sprint extends Record

implements Calculate // реализует интерфейс Calculate

{

private int dec;

public int Numbersec() // метод с округлением по dec

{

if(dec>=5)

return min*60+sec+1;

else

return min*60+sec;

}

public void Init(int m,int s,int d)

{

min=m;

sec=s;

dec=d;

}

}

WorkSport.java

package sports;

public class WorkSport

{

public static void main(String[] args)

{

Record a=new Record();

a.Init(3, 10);

Sprint b=new Sprint();

b.Init(3, 10,8);

int m,k;

m=a.Numbersec(); // вызов метода, реализованного в интерфейсе

k=b.Numbersec();// вызов метода, реализованного в интерфейсе

System.out.printf("%d %d \n",m,k); // 190 191

}

}

Клонирование объекта - копирование полей объекта в другой объект.

При присваивании на java и c# объектов копируется ссылка.

package javaapplication1;

public class Record

{

public int min,sec;

public Record(int m,int s)

{

min=m;

sec=s;

}

}

package javaapplication1;

public class lab6

{

public static void main(String[] args)

{

Record a=new Record(3,10);

Record b=new Record(4,23);

a=b; // копируется ссылка a.min=4 a.sec=23

b.min=12; // a.min=12 !! т.к. a,b ссылаются на одну и ту же область

}

}

Добавление интерфейса Cloneable для Record

package javaapplication1;

public class Record

implements Cloneable // реализация встроенного интерфейса

{

public int min,sec;

public Record(int m,int s)

{

min=m;

sec=s;

}

public Object clone() // перегрузка интерфейса Cloneable из суперкласса

{

try

{

return (Record)super.clone();

}

catch(CloneNotSupportedException e)

{

}

return this;

}

}

package javaapplication1;

public class WorkSport

{

public static void main(String[] args)

{

Record a=new Record(3,10);

Record b=new Record(4,23);

a=(Record)b.clone(); // a - копия b a.min=4 a.sec=23

b.min=12; // a.min=4 !! прежнее значение

}

}

Клонирование с полями из объектов

Record.java

package javaapplication1;

public class Record

{

public int min,sec;

public Record(int m,int s)

{

min=m;

sec=s;

}

}

Sportsman.java

package javaapplication1;

public class Sportsman

implements Cloneable // реализация клонирования

{

public String Fam;

public Record rd; // результат спортсмена

public Sportsman(String f,int m,int s) // конструктор

{

Fam=f;

rd=new Record(m,s);

}

public Object clone() // перегрузка интерфейса клонирования

{

try

{

Sportsman clone=(Sportsman)super.clone();

return clone;

}

catch(CloneNotSupportedException e)

{

}

return this;

}

}

WorkSport.java

package javaapplication1;

public class WorkSport

{

public static void main(String[] args)

{

Sportsman a=new Sportsman("Иванов",5,15);

Sportsman b=new Sportsman("Петров",6,20);

a=(Sportsman)b.clone(); // a.Fam="Петров" a.rd.min=6 a.rd.sec=20

b.Fam="Сидоров"; // a.Fam="Петров"

b.rd.min=8; // a.min=8 !! копировалась ссылка rd !!

}

}

Вывод.

В реализованном методе происходит мелкое (shallow) клонирование. Поле rd (типа Record) является ссылкой в Sportsman и при клонировании Sportsman копируется адрес. Оба поля указывают на одну область памяти и изменение поля в b автоматически меняет в a.

Исправление. Record также делается Cloneable.

Record.java

package javaapplication1;

public class Record

implements Cloneable // возможность клонирования

{

public int min,sec;

public Record(int m,int s)

{

min=m;

sec=s;

}

public Object clone() // перегрузка интерфейса клонирования

{

try

{

return (Record)super.clone();

}

catch(CloneNotSupportedException e)

{

}

return this;

}

}

Sportsman.java

package javaapplication18;

public class Sportsman

implements Cloneable

{

public String Fam;

public Record rd;

public Sportsman(String f,int m,int s)

{

Fam=f;

rd=new Record(m,s);

}

public Object clone() // перегрузка клонирования

{

try

{

Sportsman clone=(Sportsman)super.clone();

clone.rd=(Record)rd.clone(); // клонирование поля rd (Record) !!

return clone;

}

catch(CloneNotSupportedException e)

{

}

return this;

}

}

WorkSport.java

package javaapplication1;

public class WorkSport

{

public static void main(String[] args)

{

Sportsman a=new Sportsman("Иванов",5,15);

Sportsman b=new Sportsman("Петров",6,20);

a=(Sportsman)b.clone();

b.Fam="Сидоров";

b.rd.min=8; // a.rd.min=6 прежнее значение

}

}

Вывод.

В данном варианте реализовано глубокое клонирование

Интерфейс в классах Record и Sprint на C#

Проект - добавить класс - Record.cs

Проект - добавить класс - Sprint.cs

Проект - добавить класс - выбрать Интерфейс - Icalculate

Соседние файлы в папке Lesson 6