Интерфейсы. Клонирование объектов на С#
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Интерфейсы. Клонирование объектов на С#
1) Интерфейсы на C#.
Интерфейс представляет собой аналог абстрактного класса, в котором есть только
абстрактные методы. Класс реализует (implements) интерфейс, если он перегружает
абстрактные методы интерфейса.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
interface Calculate
{
int Numbersec(); // абстрактный метод для классов, реализующих интерфейс
}
class Record:Calculate // реализация интерфейса Calculate
{
protected int min,sec;
public int Numbersec() // реализованный метод в интерфейсе
{
return min*60+sec;
}
public Record(int m,int s)
{
min=m;
sec=s;
}
}
class Sprint:Record,Calculate // производный от Record и реализующий интерфейс
{
public int dec;
public int Numbersec() // метод интерфейса
{
if (dec >= 5)
return 60 * min + sec + 1;
else
return 60 * min + sec;
}
public Sprint(int m, int s, int d)
: base(m, s)
{
1
dec = d;
}
}
class Program
{
static void Main(string[] args)
{
Record a = new Record(3,5);
Sprint b = new Sprint(3,5,9);
int m, k;
m = a.Numbersec(); // вызов реализованного метода интерфейса
k = b.Numbersec(); // вызов реализованного метода интерфейса
Console.WriteLine("{0} {1}", m, k);
Console.ReadKey();
}
}
}
Абстрактный класс vs интерфейс на C#
В абстрактном классе могут быть кроме абстрактных функции, обычные.
abstract class Runner
{
....
string Getfam()
{
return Fam;
}
}
В интерфейсах могут быть только заголовки методов.
Наследоваться может только один класс, а реализовываться несколько интерфейсов(Аналог
множественного наследования).
C#
class Sprint:Record,Calculate, Calculate2 // производный от Record и реализующий
интерфейсы Calculate, Calculate2
{
...............
2
2) Клонирование объектов на C#. Встроенный интерфейс
клонирования. Мелкое и глубокое копирование на C#
Клонирование объекта - копирование полей объекта в другой объект.
На C++ проблема присваивания динамических объектов решена перегрузкой оператора
присваивания с глубоким копированием.
При присваивании на c# объектов копируется ссылка.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
protected int min,sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
public void Putmin(int m)
{
min = m;
}
}
class Program
{
static void Main(string[] args)
{
Record a = new Record(3, 5);
Record b = new Record(4, 6);
a = b;
// копируется ссылка
b.Putmin(7); // a.min=7
}
}
}
На C# возможно копирование по полям с использованием struct.
Добавим интерфейс клонирования.
3
class Record:ICloneable // интерфейс клонирования
{
protected int min,sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
public void Putmin(int m)
{
min = m;
}
public object Clone() // перегрузка метода клонирования
{
return new Record(min, sec);
}
}
class Program
{
static void Main(string[] args)
{
Record a = new Record(3, 5);
Record b = new Record(4, 6);
a = (Record)b.Clone();
// вместо a=b
b.Putmin(7); // a.min=4
}
}
}
Мелкое клонирование.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
protected int min,sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
4
public void Putmin(int m)
{
min = m;
}
}
class Sportsman : ICloneable // интерфейс клонирования
{
public string Fam;
public Record rd;
//
public Sportsman(string f, int m, int s)
public Sportsman(string f, Record r)
{
Fam = f;
//
rd = new Record(m, s);
rd = r;
}
public object Clone() // перегрузка клонирования
{
return new Sportsman(Fam, rd);
}
}
class Program
{
static void Main(string[] args)
{
Record r1 = new Record(3, 5);
Sportsman a = new Sportsman("Иванов",r1);
Record r2 = new Record(4, 6);
Sportsman b = new Sportsman("Петров", r2);
a = (Sportsman)b.Clone();
b.Fam = "Сидоров"; // a.Fam="Петров"
b.rd.Putmin(9); // a.rd.min=9! rd – копируется ссылка
}
}
}
Глубокое клонирование.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
5
class Record :ICloneable // интерфейс клонирования
{
protected int min,sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
public void Putmin(int m)
{
min = m;
}
public int Getmin()
{
return min;
}
public int Getsec()
{
return sec;
}
public object Clone() // перегрузка метода клонирования
{
return new Record(min, sec);
}
}
class Sportsman : ICloneable // интерфейс клонирования
{
public string Fam;
public Record rd;
public Sportsman(string f, int m,int s)
{
Fam = f;
rd = new Record(m,s);
}
public object Clone() // перегрузка клонирования
{
Sportsman c = new Sportsman(Fam, rd.Getmin(),rd.Getsec());
rd = (Record)rd.Clone(); // клонирование Record
return c;
}
}
class Program
{
static void Main(string[] args)
{
Sportsman a = new Sportsman("Иванов",3,5);
6
Sportsman b = new Sportsman("Петров", 4,6);
a = (Sportsman)b.Clone();
b.Fam = "Сидоров"; // a.Fam Петров
b.rd.Putmin(9);
// a.rd.min=4
}
}
}
7