Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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("Исключение в мэйне");

}

}

}

}

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