- •Void Putdec(int d);
- •Int Numberdec();
- •Int dec;
- •Void Init (int m,int s);
- •1. В базовом и производном классе нет конструкторов.
- •2. В базовом классе создан конструктор без параметров, в производном конструктор отсутствует.
- •3. В базовом классе конструктор отсутстивует, в производном создан без параметров
- •4. В базовом и производном классах есть конструкторы без параметров.
- •5. В базовом есть конструктор без параметров, в производном с параметрами.
- •6. Если в базовом классе есть конструктор с параметрами, в производном классе должен быть с параметрами и базовый конструктор должен быть явно вызван.
- •Icalculate.Cs
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