Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Наследование в языке C#.
1)Базовые и производные классы
2) Перегрузка методов базового класса
3) Конструкторы в производных классах
1) Базовые и производные классы в C#.
В C# используется только открытое наследование
Имеем класс Record (min,sec), введем новый класс Sprint, бег на короткие дистанции,
учитывающий десятые доли секунды спортсмена (int dec) . В классе добавим метод Putdec ,
устанавливающий количество десятых долей и Numberdec, вычисляющий общее число
десятых долей секунды у объектов (например, для сравнения результатов).
В C# как в C++ объект базового класса, созданный в производном доступа к private и
protected полям не имеет.
Инкапсуляция: public, private, protected разграничивают доступ к полям и методам.
Класс Record - базовый класс
Класс Sprint - производный класс
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Record
{
protected int min, sec; // для доступа объектам производных классов
public void Init(int m, int s)
{
min = m;
sec = s;
}
public int Numbersec()
{
return min * 60 + sec;
}
}
1
class Sprint : Record // наследование
// C++ - public: Record Java - extends Record
{
private int dec;
public void Putdec(int d)
{
dec=d;
}
public int Numberdec()
{
int k;
k = 60 * min + sec; // protected
return k*10+dec;
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Record a=new Record();
Sprint b=new Sprint();
int m,k;
a.Init(5, 6);
b.Init(5, 6); // наследуемый метод
b.Putdec(8);
m = b.Numberdec();
k = b.Numbersec(); // вызов наследуемого метода
}
}
}
Статические поля и методы нормально наследуются, но копия также одна на все объекты.
В C# частично множественное наследование реализуется в интерфейсах.
2
2) Перегрузка методов базового класса в c#
Возможна перегрузка метода из базового класса в производном классе.
Пример – переопределение Init в Sprint
class Sprint : Record
{
private int dec;
..................................
public void Init(int m, int s, int d) // перегрузка
{
min = m;
sec = s;
dec = d;
}
static void Main(string[] args)
{
Record a=new Record();
Sprint b=new Sprint();
Sprint c = new Sprint();
int m, k;
a.Init(5, 6);
b.Init(5, 6,9); // вызов перегруженного метода
c.Init(5, 6); // вызов наследуемого метода (нет перекрытия как на C++)
с.Putdec(8);
..................................
Возможна перегрузка метода с теми же аргументами, как и в базовом классе.
class Sprint : 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 void Init(int m, int s, int d) // вариант с вызовом базового класса
{
3
base.Init(m, s);
dec = d;
}
public void Init(int m, int s) // перегрузка базового с теми же аргументами
{
min = m;
sec = s;
dec = 1;
}
static void Main(string[] args)
{
Record a=new Record();
Sprint b=new Sprint();
Sprint c = new Sprint();
int m, k;
a.Init(5, 6);
b.Init(5, 6); // вызов перегруженного метода dec=1
c.Init(5, 6, 8);
b.Putdec(8);
}
На C# можно вывести объекты целиком, переводя их в string, перегрузив встроенный метод
toString, имеющийся для всех объектов.
Пример вывода объекта в C#
class Record
{
protected int min, sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
public override string ToString() // перегрузка встроенного метода перевода полей в
строку
{
string s = "";
s += Convert.ToString(min) + " " + Convert.ToString(sec);
return s;
}
}
4
class Program
{
static void Main(string[] args)
{
Record s = new Record(1, 5);
Console.WriteLine(s);
}
}
вывод:
1 5
3) Конструкторы в производных классах
Конструкторы не наследуются. Правила работы с конструкторами производного класса.
Если в базовом классе есть конструктор без параметров, созданный в классе или
сгенерированный по умолчанию, при создании объектов производного класса сначала
вызывается конструктор базового класса.
При вызове деструктора, наоборот, сначала вызывается деструктор производного
класса, потом базового.
namespace ConsoleApplication1
{
class Record
{
protected int min, sec;
public Record(int m, int s)
{
min = m;
sec = s;
}
}
class Sprint: Record
{
int dec;
public Sprint(int m,int s,int d):base(m,s) // вызов конструктора базового класса
{
dec=d;
}
}
class Program
{
static void Main(string[] args)
{
Sprint z = new Sprint(1, 2, 9);
}
}
5