ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.08.2024

Просмотров: 1123

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Основы c#. Урок 1. Что такое c#?

Основы c#. Урок 2. Что такое net Runtime?

Основы c#. Урок 3. Первая программа на c#

Основы c#. Урок 4. Переменные языка c#

Основы c#. Урок 5. Логические операторы

Основы c#. Урок 6. Массивы в c#

Основы c#. Урок 7. Операторы if и switch

Основы c#. Урок 8. Циклы for и foreach

Основы c#. Урок 9. Цикл while

Основы c#. Урок 10. Классы в c#

Основы c#. Урок 11. Конструкторы классов

Основы c#. Урок 12. Наследование

Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного

Основы c#. Урок 14. Вложенные классы

Основы c#. Урок 15. Перегрузка бинарных операторов

Основы c#. Урок 16. Перегрузка унарных операторов

Основы c#. Урок 17. Область видимости

Основы c#. Урок 18. Виртуальные функции

Основы c#. Урок 19. Абстрактные классы

Основы c#. Урок 20. Запрещение наследования или модификатор sealed

Основы c#. Урок 21. Статические переменные

Основы c#. Урок 22. Статические методы класса

Основы c#. Урок 23. Статические конструкторы

Основы c#. Урок 24. Закрытые конструкторы или классы без экземпляров

Основы c#. Урок 25. Передача параметров переменой длины

Основы c#. Урок 26. Строки (класс System.String)

Основы c#. Урок 27. Строки (класс StringBuilder)

Основы c#. Урок 28. Передача параметров по ссылке и по значению (ref и out)

Основы c#. Урок 29. Пример передачи по ссылке

Основы c#. Урок 30. Перегрузка

Основы c#. Урок 31. Функции класса System.Array

Основы c#. Урок 33. События

Основы c#. Урок 35. Введение в атрибуты

Основы c#. Урок 36. Пример пользовательского атрибута.

Основы c#. Урок 37. Параметры командной строки

Основы c#. Урок 38. Метод Main в отдельном классе

Основы c#. Урок 39. Форматированный вывод

Основы c#. Урок 40. Класс System.Object

Основы c#. Урок 41. Методы класса System.Object

Основы c#. Урок 42. Переопределяем методы класса System.Object

Основы c#. Урок 43. Константы

Основы c#. Урок 44. Модификаторы доступа

Основы c#. Урок 45. Ссылка на текущий экземпляр класса (this)

Основы c#. Урок 47. Работаем со специальными папками

Основы c#. Урок 48. Получаем список всех дисков

Основы c#. Урок 49. Ввод/вывод в c# (System.Io)

Основы c#. Урок 50. Классы для работы с папками и файлами

Основы c#. Урок 51. Класс Directory

Основы c# Урок 52. Класс File

Основы c# Урок 53. Класс FileSystemInfo

Основы c# Урок 54. Класс DirectoryInfo

Основы c# Урок 55. Перечисление FileAttributes

Основы c# Урок 56. Класс FileInfo

Основы c# Урок 57. Пример: получение имен всех подпапок

virtual public void setAge(int age)

{

if(age>0 && age<100)

this.age=age;

else

this.age=0;

}

public int getAge()

{

return age;

}

}

//Класс Boss

class Boss : Worker

{

publicintnumOfWorkers;//Количество подчиненных

override public void setAge(int age)

{

if(age>0 && age<45)

this.age=age;

else

this.age=0;

}

}

class Test

{

static void Main(string[] args)

{

Worker boss = new Boss();

boss.setAge(50);

Console.WriteLine("Возраст босса "+boss.getAge());

}

}

}

Как вы видите, тут функцию setAge в родительском классе Worker мы определили с ключевым словом virtual, а одноименную функцию в производном классе Boss - с ключевым словом ovеrride.

Обратите внимание на то, что из какого конкретно класса вызывается функция (из родительского или производного) определяется на этапе выполнения программы, а не на этапе компиляции. В принципе в переменную родительского типа мы могли бы записать экземпляр именно родительского класса. В этом случае, естественно, вызвалась бы функция родительского класса. Вот поясняющий это утверждение пример:

class Test

{

static void Main(string[] args)

{

Worker boss;

bool b;

//Присваиваем значение в переменную b

...

if(b)

{

//В переменной boss - экземпляр класса Boss

boss=new Boss();

}

else

{

//В переменной boss - экземпляр класса Worker

boss=new Worker();

}

//Вызываем метод класса Boss или Worker

boss.setAge(50);

Console.WriteLine("Возраст "+boss.getAge());

}

}

С этим уроким все!


Основы c#. Урок 19. Абстрактные классы

Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе нет реализации этих методов. Абстрактные методы пишутся с модификатором abstract. Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным (а таком классе могу быть и обычные методы). Нельзя создавать экземпляры абстрактного класса - такой класс может использоваться только в качестве базового класса для других классов. Для потомка такого класса есть две возможности - или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или он реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом и единственная возможность его использования - это производить от него классы-потомки). Вот пример, иллюстрирующий использование абстрактных классов:

usingSystem;

namespace test

{

abstract class Figure

{

//Площадь фигуры

public abstract double square();

public abstract double perimeter();

}

class Triangle: Figure

{

double a, b, c; //Стороны

//Конструктор

public Triangle(double a, double b, double c)

{

this.a=a;

this.b=b;

this.c=c;

}

public override double square()

{

//Используем формулу Герона

doublep = (a+b+c)/2;

return Math.Sqrt(p*(p-a)*(p-b)*(p-c));

}

public override double perimeter()

{

return a+b+c;

}

}

class Rectangle: Figure

{

double a, b; //Стороны

//Конструктор

public Rectangle(double a, double b)

{

this.a=a;

this.b=b;

}

public override double square()

{

return a*b;

}

public override double perimeter()

{

return (a+b)*2;

}

}

class Test

{

public static void Main()

{

Figure f1, f2;

f1=new Triangle(3, 4, 5);

f2=new Rectangle(2, 6);

System.Console.WriteLine(f1.perimeter()+", "+ f1.square());

System.Console.WriteLine(f2.perimeter()+", "+ f2.square());

}

}

}

Тут мы объявляем абстрактный класс Figure, от которого производим два класса - Rectangle (класс прямоугольника) и Triangle (треугольника). В классе Figure есть два абстрактных метода - square (для подсчета площади) и perimeter (для периметра). Так как для призвольной фигуры формул для площади и для периметра не существует, то эти методы объявлены в классе Figure и переопределены в производных классах (с ключевым словом override). Далее в классе Test мы проводим испытание - заводим две переменные типа ссылка на базовый класс Figure, ниже в эти ссылки мы записываем созданные экземпляры производных классов Triangle и Rectangle. Обратите внимание, что ссылку на абстрактный класс мы создать можем, а экземпляр - нет. Далее мы выводим на экран периметр и площадь для наших фигур.



Основы c#. Урок 20. Запрещение наследования или модификатор sealed

На прошлом уроке мы рассмотрели абстрактные классы. Их основное назначение - быть предками для других классов. На другом конце иерархии стоят так называемые sealed-классы. От них нельзя производить другие классы. Синтаксис для тах такой же, как и для обычных классов, за исключением ключевого слова sealed. Вот пример:

...

sealed class MyClass

{

//Методы и переменные класса

intx;

...

}

class MyClass2: MyClass //Ошибка!

{

...

}

...

Как вы видите, от sealed-класса MyClass нельзя делать классы-потомки.

Основы c#. Урок 21. Статические переменные

Обычно переменные класса принадлежат конкретному экземпляру класса. Для обращения к таким переменным мы пишем что-то вроде

MyClass z;

k=z.data;

Здесь переменная data принидлежит классу MyClass. Для каждого экземпляра класса она своя.

Наряду с обычными переменными существуют и статические переменые класса. Их основное отличие от обычных переменных в том, что они относятся к классу целиком. Т. е. на все экземпляры класса у нас есть только одна переменая. Получить доступ к такой переменой можно только для самого класса без создания его экземпляра. Через конкретный же экземпляр класса доступа к такой перемнной нет. Т. е. использовать такую статическую переменную можно только для самого класса без создания экземпляра.

Для объявления переменной статический надо использовать ключевое слово static. Вот пример:

classMyClass

{

//Статическая переменная

publicstaticintdata;

//Конструктор

public MyClass()

{

data++;

}

}

class Test

{

public static void Main()

{

MyClass a=new MyClass();

MyClass b=new MyClass();

System.Console.WriteLine(MyClass.data);

}

}

Указанный фрагмент выведет на экран, естественно, 2 (переменая data увеличится в каждом из двух конструкторов).

Основы c#. Урок 22. Статические методы класса

На предыдущем уроке мы рассмотрели статические переменные класса. При этом наша переменная data была объявлена как public. Это не слишком хорошо - переменные класса лучше прятать от посторонних глаз. Но, так как доступ к нашей переменной нам все-таки нужен, то мы добавим в наш класс функции для чтения и записи переменной data. Вот новый вариант нашего класса:


classMyClass

{

//Статическая переменная

static int data;

//Статический метод для чтения переменной

public static int GetData()

{

returndata;

}

//Статический метод для записи переменной

public static void SetData(int newData)

{

data=newData;

}

//Конструктор

public MyClass()

{

data++;

}

}

class Test

{

public static void Main()

{

MyClass a=new MyClass();

MyClass b=new MyClass();

//Вызов статического метода GetData

System.Console.WriteLine(MyClass.GetData());

//Вызов статического метода SetData

MyClass.SetData(5);

System.Console.WriteLine(MyClass.GetData());

}

}

Указанный фрагмент выведет, разумеется, 2 и 5.

Обратите внимание, что к статическим переменным и методам мы всегда получаем доступ через имя класса, а к нестатическим - через экземпляр класса. Но это не значит, что мы не имеем доступа к статическим переменным класса из нестатических методов класса - имеем, и даже у нас есть пример этому - конструктор нашего класса MyClass.