Абс. Классы: Кроме обычных классов в C# есть абстрактные классы. Абстрактный класс похож на обычный класс. Он также может иметь переменные, методы, конструкторы, свойства. Единственное, что при определении абстрактных классов используется ключевое слово abstract:
abstract class Human{ public int Length { get; set; }public abstract void Display();}
Но главное отличие состоит в том, что мы не можем использовать конструктор абстрактного класса для создания его объекта (т.е. написать Human human = new Human() нельзя).
Интерфейсы Они играют важную роль в системе ООП. Интерфейсы позволяют определить некоторый функционал, не имеющий конкретной реализации. Затем этот функционал реализуют классы, применяющие данные интерфейсы.
Изменим пустой код интерфейса IAccount на следующий:
interface IAccount
{
int CurrentSum { get; }
void Put(int sum);
void Withdraw(int sum);
}
У интерфейса методы и свойства не имеют реализации, в этом они сближаются с абстрактными методами абстрактных классов. Сущность данного интерфейса проста: он определяет свойство для текущей суммы денег на счете и два метода для добавления денег на счет и изъятия денег.
Еще один момент в объявлении интерфейса: все его члены - методы и свойства не имеют модификаторов доступа, но фактически по умолчанию доступ public. Если класс применяет интерфейс, то этот класс должен реализовать все методы и свойства интерфейса.
Операторы is и as C# Оператор is проверяет совместимость объекта с данным типом, а в качестве результата выдает значение булева типа, либо правду, либо ложь. Оператор is никогда не генерирует исключение, он работает со всеми типами.
Например. int i=8; Object o=new Object(); Boolean b=(i is Object); //b будет равно true
Boolean b1=(o is int); //b1 будет равно false
Если ссылка равна null, то оператор возвращает ложь, так как нет объекта, для которого нужно определить тип. Оператор as работает со ссылочными типами, он производит нужное преобразование типов, если оно возможно и возвращает null, если оно невозможно. Команда A a=o as A; будет выполнена успешно, но в ссылку а будет записан null, и любое обращение к а как к объекту, например, a.ToString(); вызовет генерацию исключения.
Приведение объекта к интерфейсу
interface IAction
{
void Move();
}
class BaseAction : IAction
{
public void Move()
{
Console.WriteLine("Move in BaseAction");
}
}
class HeroAction : BaseAction, IAction
{
void IAction.Move()
{
Console.WriteLine("Move in HeroAction");
}
}
Несмотря на то, что базовый класс BaseAction уже реализовал интерфейс IAction, но производный класс по-своему реализует его. Применение классов:
HeroAction action1 = new HeroAction();
action1.Move(); // Move in BaseAction
((IAction)action1).Move(); // Move in HeroAction
IAction action2 = new HeroAction();
action2.Move(); // Move in HeroAction