Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Министерство образования и науки Российской Федерации
НГТУ
Кафедра вычислительной техники
Лабораторная работа № 2
Структуры и перечисления как частные виды классов.
Классы. Интерфейсы
Вариант 12
Факультет: АВТФ Преподаватель:
Группа: АВТ–909
Студент:
Новосибирск
2011 г.
Цель работы:
- Научиться создавать типы данных структуры и перечисление.
- Изучить методы работы со структурами и перечислениями в программе на С#.
- Ознакомиться со структурой класса, его созданием и использованием, описанием членов-данных класса и различных методов доступа к ним, возможностью создания и инициализации объектов класса с помощью различных конструкторов.
Задание к лабораторной работе
1. Проработать примеры 1-6, данные в теоретических сведениях. Создать на их основе программы. Получить результаты работы программ и уметь их объяснить. Внести их в отчет с комментариями.
2. Для предложенной структуры данных разработать абстрактный класс и класс наследник. В классе реализовать несколько конструкторов. Создать методы, работающие с полями класса. Часть из них должны быть виртуальными. Добавить методы-свойства и индексаторы.
3. Разработать интерфейсные классы, добавляющие некоторые методы работы с объектами класса. Изучить причины возникновения коллизии имен и способы устранения.
4. Разработать классы исключительных ситуаций и применить их для обработки, возникающих исключений.
5. Написать демонстрационную программу.
Программа 1. Использование перечислений и структур в программах на C#
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
enum EmpType : byte
{
Manager = 10,
Grunt = 1,
Contractor = 100,
VP = 9
}
struct Employee
{
public EmpType title; // Одно из полей структуры – перечисление
public string name;
public short deptID;
public Employee (EmpType et, string n, short d)
{
title = et;
name = n;
deptID = d;
}
}
static void Main(string[] args)
{
Employee fred;
fred. deptID = 40;
fred. name = "Fred";
fred. title = EmpType. Grunt;
Console. WriteLine(fred. deptID);
Console. WriteLine(fred. name);
Console. WriteLine(fred. title);
Console. WriteLine(Convert. ToInt32(fred. title));
Console. WriteLine("\n");
Employee fred1 = new Employee(EmpType. Contractor, "Fred1", 5);
Console. WriteLine(fred1.deptID);
Console. WriteLine(fred1.name);
Console. WriteLine(fred1.title);
Console. WriteLine(Convert. ToInt32(fred1.title));
}
}
}

Программа 2. Свойства в классах в C#
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public class Person
{
//поля (все закрыты)
string fam="", status="", health="";
int age=0, salary=0;
//стратегия: Read, Write-once
public string Fam
{
set {if (fam == "") fam = value;}
get {return(fam);}
}
//стратегия: Read-only
public string Status
{
get {return(status);}
}
//стратегия: Read, Write
public int Age
{
set
{
age = value;
if(age < 7) status ="ребенок";
else if(age <17) status ="школьник";
else if (age < 22) status = "студент";
else status = "служащий";
}
get {return(age);}
}
//стратегия: Write-only
public int Salary
{
set {salary = value;}
}
}
static public void TestPersonProps()
{
Person pers1 = new Person();
pers1.Fam = "Петров";
pers1.Age = 21;
pers1.Salary = 1000;
Console. WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);
pers1.Fam = "Иванов"; pers1.Age += 1;
Console. WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);
}
static void Main(string[] args)
{
TestPersonProps();
}
}
}

Программа 3. Индексаторы в классах в C#
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public class Person
{
//поля (все закрыты)
string fam = "", status = "";
int age = 0, salary = 0;
const int Child_Max = 10; //максимальное число детей
Person[] children = new Person[Child_Max];
int count_children = 0; //число детей
//стратегия: Read, Write-once
public string Fam
{
set { if (fam == "") fam = value; }
get { return (fam); }
}
//стратегия: Read-only
public string Status
{
get { return (status); }
}
public int Count_children
{
get { return (count_children); }
}
//стратегия: Read, Write
public int Age
{
set
{
age = value;
if (age < 7) status = "ребенок";
else if (age < 17) status = "школьник";
else if (age < 22) status = "студент";
else status = "служащий";
}
get { return (age); }
}
//стратегия: Write-only
public int Salary
{
set { salary = value; }
}
public Person this[int i] //индексатор
{
get
{
if (i >= 0 && i < count_children) return (children[i]);
else return (children[0]);
}
set
{
if (i == count_children && i < Child_Max)
{
children[i] = value; count_children++;
}
}
}
}
static public void TestPersonChildren()
{
Person pers1 = new Person(), pers2 = new Person();
pers1.Fam = "Петров"; pers1.Age = 42; pers1.Salary = 10000;
pers1[pers1.Count_children] = pers2;
pers2.Fam = "Петров"; pers2.Age = 21; pers2.Salary = 1000;
Person pers3 = new Person();
pers1[pers1.Count_children] = pers3;
pers3.Fam = "Петрова"; pers3.Age = 5;
Console. WriteLine("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);
Console. WriteLine("Сын={0}, возраст={1}, статус={2}", pers1[0].Fam, pers1[0].Age, pers1[0].Status);
Console. WriteLine("Дочь={0}, возраст={1}, статус={2}", pers1[1].Fam, pers1[1].Age, pers1[1].Status);
}
static void Main(string[] args)
{
TestPersonChildren();
}
}
}

Программа 4. Наследование в C#
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public class Found
{
protected string name;
protected int credit;
public Found() { }
public Found(string name, int sum)
{
this. name = name; credit = sum;
}
public virtual void VirtMethod()
{ //виртуальный метод
Console. WriteLine("Отец: " + this. ToString());
}
public override string ToString()
{ //переопределенный метод базового класса Object
return (String. Format("поля: name = {0}, credit = {1}", name, credit));
}
public void NonVirtMethod()
{
Console. WriteLine("Мать: " + this. ToString());
}
public void Analysis()
{
Console. WriteLine("Простой анализ");
}
public void Work()
{
VirtMethod();
NonVirtMethod();
Analysis();
}
}
public class Derived:Found
{
protected int debet;
public Derived() {}
public Derived(String name, int cred, int deb): base (name, cred)
{
debet = deb;
}
public void DerivedMethod() //новый метод потомка
{
Console. WriteLine("Это метод класса Derived");
}
new public void Analysis() //сокрытие метода родителя
{
base. Analysis();
Console. WriteLine("Сложный анализ");
}
public void Analysis(int level) // перегрузка метода
{
base. Analysis();
Console. WriteLine("Анализ глубины {0}", level);
}
public override String ToString() //переопределение метода
{
return(String. Format("поля: name = {0}, credit = {1},debet ={2}",name, credit, debet));
}
public override void VirtMethod() // переопределение метода родителя
{
Console. WriteLine ("Сын: " + this. ToString() );
}
public void Work1()
{
VirtMethod();
NonVirtMethod();
Analysis();
}
}
static void Main(string[] args)
{
Found n=new Found("Имя",15);
n. Work();
Derived m = new Derived("Имя2", 15, 25);
m. DerivedMethod();
m. Work1();
}
}
}
Программа 5. Коллизии имен в интерфейсах.
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public interface IProps
{
void Prop1(string s);
void Prop2(string name, int val);
void Prop3();
}
public interface IPropsOne
{
void Prop1(string s);
void Prop2(int val);
void Prop3();
}
public class ClainTwo : IProps, IPropsOne
{
public void Prop1(string s)
{
Console. WriteLine(s);
}
public void Prop2(string s, int x)
{
Console. WriteLine(s + "; " + x);
}
public void Prop2(int x)
{
Console. WriteLine(x);
}
void IProps. Prop3() // private реализация и переименование методов двух интерфейсов
{
Console. WriteLine("Метод 3 интерфейса 1");
}
void IPropsOne. Prop3()
{
Console. WriteLine("Метод 3 интерфейса 2");
}
public void Prop3FromInterface1()
{
((IProps)this).Prop3();
}
public void Prop3FromInterface2()
{
((IPropsOne)this).Prop3();
}
}
static public void TestCliTwoInterfaces()
{
Console. WriteLine("Объект сlainTwo вызывает методы двух интерфейсов!");
ClainTwo claintwo = new ClainTwo();
claintwo. Prop1("Склейка свойства двух интерфейсов");
claintwo. Prop2("перегрузка.: ", 99);
claintwo. Prop2(9999);
claintwo. Prop3FromInterface1();
claintwo. Prop3FromInterface2();
Console. WriteLine("Интерфейсный объект вызывает методы 1-го интерфейса!");
IProps ip1 = (IProps)claintwo;
ip1.Prop1("интерфейс IProps: свойство 1");
ip1.Prop2("интерфейс 1 ", 88);
ip1.Prop3();
Console. WriteLine("Интерфейсный объект вызывает методы 2-го интерфейса!");
IPropsOne ip2 = (IPropsOne)claintwo;
ip2.Prop1("интерфейс IPropsOne: свойство1");
ip2.Prop2(7777);
ip2.Prop3();
}
static void Main(string[] args)
{
TestCliTwoInterfaces();
}
}
}

Программа 6. Наследование от общего предка.
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public interface IParent
{
void ParentMethod();
}
public interface ISon1 : IParent
{
void Son1Method();
}
public interface ISon2 : IParent
{
void Son2Method();
}
public class Pars : ISon1, ISon2
{
public void ParentMethod()
{
Console. WriteLine("Это метод родителя!");
}
public void Son1Method()
{
Console. WriteLine("Это метод старшего сына!");
}
public void Son2Method()
{
Console. WriteLine("Это метод младшего сына!");
}
}
static public void TestIParsons()
{
Console. WriteLine("Объект класса вызывает методы трех интерфейсов!");
Pars ct = new Pars();
ct. ParentMethod();
ct. Son1Method();
ct. Son2Method();
Console. WriteLine("Интерфейсный объект 1 вызывает свои методы!");
IParent ip = (IParent)ct;
ip. ParentMethod();
Console. WriteLine("Интерфейсный объект 2 вызывает свои методы!");
ISon1 ip1 = (ISon1)ct;
ip1.ParentMethod();
ip1.Son1Method();
Console. WriteLine("Интерфейсный объект 3 вызывает свои методы!");
ISon2 ip2 = (ISon2)ct;
ip2.ParentMethod();
ip2.Son2Method();
}
static void Main(string[] args)
{
TestIParsons();
}
}
}

Реализация собственного класса
МУЗЕЙ: Название, адрес, ФИО директора, количество и название залов.
using System;
using System. Collections. Generic;
using System. Text;
using System. Text. RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public class MyException : Exception { }
public interface Inter1 //Интерфейс 1
{
void Fun(string s);
void Fun1();
void Fun0();
}
public interface Inter2 //Интерфейс 2
{
void Fun(string s);
void Fun2();
void Fun0();
}
public class Museam : Inter1, Inter2
{
void Inter1.Fun0()
{
Console. WriteLine("Переименование интерфейсных методов - Inter1");
}
void Inter2.Fun0()
{
Console. WriteLine("Переименование интерфейсных методов - Inter2");
}
public void Fun0Inter1() //Обёртывание
{
((Inter1)this).Fun0();
}
public void Fun0Inter2() //Обёртывание
{
((Inter2)this).Fun0();
}
public void Fun(string s) //Склеивание методов интерфейса
{
Console. WriteLine(s);
Console. WriteLine("Название:{0}\nАдрес:{1}\nФамилия директора:{2}\nКоличество залов:{3}", name, adr, fio, num);
}
public void Fun1()
{
Console. WriteLine("Inter1");
for (int i = 0; i < list. Length; i++)
if (this[i] != null) Console. WriteLine("Зал №{0}:{1}\n", i, this[i]);
}
public void Fun2()
{
Console. WriteLine("Inter2");
for (int i = 0; i < list. Length; i++)
{
if (this[i] != null) Console. WriteLine("Зал №{0}:{1}\n", i, this[i]);
}
}
protected string name = "", adr = "", fio = "";
protected int num = 0;
protected string[] list = new string[10];
public string Name
{
set { if (name == "") name = value; }
get { return (name); }
}
public string Adr
{
set { if (adr == "") adr = value; }
get { return (adr); }
}
public string Fio
{
set { if (fio == "") fio = value; }
get { return (fio); }
}
public int Num
{
set { num = value; }
get
{
if (num <= 5 && num > 0) return (num);
else return 0;
}
}
public string this[int i]
{
get { return (list[i]); }
set
{
if (i == num && i < 6)
{
list[i] = value; num++;
}
}
}
public Museam() { }
public Museam(string n)
{
name = n;
}
public void plusnum()
{
try
{
if (num > 5 || num < -1) throw (new MyException());
num++;
}
catch (MyException me)
{
Console. WriteLine("Исключение в методе - неверное количество залов");
}
}
public void minusnum()
{
try
{
if (num > 5 || num < 1) throw (new MyException());
num--;
}
catch (MyException me)
{
Console. WriteLine("Исключение в методе - неверное количество залов");
}
}
public virtual void addq(string k)
{
try
{
if (num > 4) throw (new MyException());
this[num] = k;
Console. WriteLine("В класс-родитель добавлен зал");
}
catch (MyException me)
{
Console. WriteLine("Исключение в функции-родителе - слишком много залов");
}
}
}
public class Museam1 : Museam
{
protected int numb = 0;
public int Numb
{
set { numb = value; }
get { return (numb); }
}
public Museam1() { }
public Museam1(string k, int n) : base(k) { numb = n; }
public override void addq(string k)
{
try
{
if (num > 4) throw (new MyException());
this[num] = k;
Console. WriteLine("В класс-наследник добавлен зал - переопределение");
}
catch (MyException me)
{
Console. WriteLine("Исключение в функции-наследнике - слишком много залов.");
throw (new MyException());
}
}
public void minusnum(int n)
{
for (int j = 0; j < n; j++)
base. minusnum();
Console. WriteLine("minusnum-перегрузка, отнимаем {0}", n);
}
new public void plusnum()
{
Console. WriteLine("Число экспонатов в классе-наследнике:{0} - plusnum-скрытие", numb);
Console. WriteLine();
}
}
static void Main(string[] args)
{
try
{
Museam ex = new Museam("Палеонтологический музей");
ex. Adr = "Ул. Титова, 15";
ex. Fio = "Попов";
ex. addq("Первый");
ex. addq("Второй");
ex. addq("Третий");
ex. Fun("Класс-родитель");
ex. Fun1();
ex. plusnum();
Museam1 ex1 = new Museam1("Исторический музей", 90908);
ex1.Adr = "Ул. Мира, 5";
ex1.Fio = "Андреев";
ex1.addq("Шестой");
ex1.addq("Девятый");
ex1.addq("Восемнадцатый");
ex1.addq("И ещё один");
ex1.Fun("Класс-наследник");
ex1.Fun2();
ex1.Fun0Inter1();
ex1.Fun0Inter2();
((Inter1)ex1).Fun0();
((Inter2)ex1).Fun0();
ex1.minusnum(1);
ex1.plusnum();
ex1.addq("Шестой");
ex1.addq("Девятый");
ex1.addq("Восемнадцатый");
ex1.addq("И ещё один");
ex1.addq("Шестой");
ex1.addq("Девятый");
ex1.addq("Восемнадцатый");
ex1.addq("И ещё один");
}
catch (MyException me)
{
Console. WriteLine("Исключение в мэйне");
}
}
}
}

Вывод: в процессе выполнения лабораторной работы я изучила особенности создания классов в С#, научилась создавать класс-родитель и класс-наследник, писать конструкторы, методы, работающие с полями класса, виртуальные методы, методы-свойства, индексаторы, интерфейсные классы и особенности в наследовании интерфейсов, способы борьбы с коллизией имён, обёртывание и кастинг, а также научилась разрабатывать классы исключительных ситуаций и генерировать исключения.


