
- •1)Принципы ооп (инкапсуляция, наследование, полиморфизм)
- •Формы полиморфизма Edit
- •2)Структура программы на с#
- •3)Встроенные типы данных. Типы-значения и ссылочные типы, упаковка и распаковка
- •4)Переменные и их инициализация, область видимости и время жизни переменных Проект Variables
- •Синтаксис объявления
- •Время жизни и область видимости переменных
- •Глобальные переменные уровня модуля.
- •Константы
- •5)Арифметические операторы, логические операторы
- •6)Приоритет операций, преобразование типов в выражениях
- •7)Оператор присваивания
- •Составные операторы присваивания
- •8)Операторы условный и выбора
- •Оператор if
- •Оператор switch
- •9)Операторы цикла
- •Цикл for
- •Цикл while
- •Цикл do. . . While
- •Цикл foreach
- •10)Операторы перехода
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •11)Массивы, создание и инициализация массивов, ступенчатые массивы
- •Инициализация массива
- •Неявно типизированные массивы
- •Определение массива объектов
- •Свойство Length
- •Двумерные массивы
- •Массивы трех и более измерений
- •Инициализация многомерных массивов
- •Применение свойства Length при обращении со ступенчатыми массивами
- •12)Классы и объекты, элементы класса
- •Общая форма определения класса
- •Данные-члены
- •Функции-члены
- •Переменные ссылочного типа и присваивание
- •Инициализаторы объектов
- •Методы, статические методы, параметры методов
- •Объявление методов
- •Возврат из метода и возврат значения
- •Использование параметров
- •14)Перегрузка методов
- •15)Конструкторы
- •16)Сборка мусора и деструкторы
- •Деструкторы
- •17)Перегрузки операторов
- •Перегрузка бинарных операторов
- •Перегрузка унарных операторов
- •Выполнение операций со встроенными в с# типами данных
- •Перегрузка операторов отношения и операторов true - false
- •Перегрузка операторов отношения
- •Перегрузка операторов true и false
- •Перегрузка логических операторов
- •Перегрузка укороченных логических операторов
- •Свойства
- •Автоматически реализуемые свойства
- •19)Индексаторы
- •Одномерные индексаторы
- •Многомерные индексаторы
- •20)Основы наследования
- •21)Конструкторы и наследование
- •23)Виртуальные методы
Многомерные индексаторы
Можно также создавать индексатор, принимающий несколько параметров:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class MyArr
{
int[,] arr;
// Размерность двухмерного массива
public int rows, cols;
public int Length;
public MyArr(int rows, int cols)
{
this.rows = rows;
this.cols = cols;
arr = new int[this.rows, this.cols];
Length = rows * cols;
}
// Индексатор
public int this[int index1, int index2]
{
get
{
return arr[index1, index2];
}
set
{
arr[index1, index2] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
Random ran = new Random();
Console.WriteLine("Arr1: \n");
MyArr arr1 = new MyArr(4,5);
for (int i = 0; i < arr1.rows - 1; i++)
{
for (int j = 0; j < arr1.cols - 1; j++)
{
arr1[i, j] = ran.Next(1,20);
Console.Write(arr1[i, j] + "\t");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}
20)Основы наследования
C# --- Руководство по C# --- Основы наследования
Наследование является одним из трех основополагающих принципов объектно-ориентированного программирования, поскольку оно допускает создание иерархических классификаций. Благодаря наследованию можно создать общий класс, в котором определяются характерные особенности, присущие множеству связанных элементов. От этого класса могут затем наследовать другие, более конкретные классы, добавляя в него свои индивидуальные особенности.
В языке С# класс, который наследуется, называется базовым, а класс, который наследует, — производным. Следовательно, производный класс представляет собой специализированный вариант базового класса. Он наследует все переменные, методы, свойства и индексаторы, определяемые в базовом классе, добавляя к ним свои собственные элементы.
Поддержка наследования в С# состоит в том, что в объявление одного класса разрешается вводить другой класс. Для этого при объявлении производного класса указывается базовый класс. При установке между классами отношения "является" строится зависимость между двумя или более типами классов. Базовая идея, лежащая в основе классического наследования, заключается в том, что новые классы могут создаваться с использованием существующих классов в качестве отправной точки:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class ProfessorWeb
{
const string ADDR = "http:\\professorweb.ru";
public string level, inLevel;
public int numberSt;
private string inf;
public void InfoPW()
{
Console.WriteLine("Сайт: {0}\nРаздел: {1}\nПодраздел: {2}\nКол-во статей:{3}",ADDR,level,inLevel,numberSt);
}
}
// Объявляем класс, унаследованный от класса ProfessorWeb
class CSharp : ProfessorWeb
{
public string st;
// Поля класса ProfessorWeb доступны через конструктор наследуемого класса
public CSharp(string level, string inLevel, int numberSt, string st)
{
this.level = level;
this.inLevel = inLevel;
this.numberSt = numberSt;
this.st = st;
}
public void St()
{
Console.WriteLine("Статья: "+st);
}
}
class Program
{
static void Main()
{
CSharp obj = new CSharp(level: "C#", inLevel: "Перегрузка", numberSt: 7, st: "Перегрузка методов");
obj.InfoPW();
obj.St();
Console.ReadLine();
}
}
}
Всякий раз, когда один класс наследует от другого, после имени базового класса указывается имя производного класса, отделяемое двоеточием. В С# синтаксис наследования класса удивительно прост и удобен в использовании. Ниже представлено схематичное представление класса CSharp из вышеуказанного примера:
Как видите класс CSharp получает доступ к полям и методам класса ProfessorWeb. Всегда помните, что наследование предохраняет инкапсуляцию, а потому приватные члены никогда не могут быть доступны через ссылку на объект. Т.е. поле inf из примера не может быть доступно для вызова с помощью экземпляра класса obj.
Для любого производного класса можно указать только один базовый класс. В С# не предусмотрено наследование нескольких базовых классов в одном производном классе. (В этом отношении С# отличается от С++, где допускается наследование нескольких базовых классов. Данное обстоятельство следует принимать во внимание при переносе кода С++ в С#.) Тем не менее можно создать иерархию наследования, в которой производный класс становится базовым для другого производного класса. (Разумеется, ни один из классов не может быть базовым для самого себя как непосредственно, так и косвенно.) Но в любом случае производный класс наследует все члены своего базового класса, в том числе переменные экземпляра, методы, свойства и индексаторы.
Главное преимущество наследования заключается в следующем: как только будет создан базовый класс, в котором определены общие для множества объектов атрибуты, он может быть использован для создания любого числа более конкретных производных классов. А в каждом производном классе может быть точно выстроена своя собственная классификация.