Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример абстрактного класса




Abstract class Person

{

public string Name { get; set; }

 

public Person(string name)

{

   Name = name;

}

 

public void Display()

{

   Console.WriteLine(Name);

}

}

 

Class Client: Person

{

public int Sum { get; set; } // сумма на счету

 

public Client(string name, int sum)

  : base(name)

{

   Sum = sum;

}

}

 

Class Employee: Person

{

public string Position { get; set; } // должность

 

public Employee(string name, string position)

  : base(name)

{

       Position = position;

}

}

 

Затем мы сможем использовать эти классы:

Client client = new Client("Tom", 500);

Employee employee = new Employee ("Bob", "Apple");

client.Display();

employee.Display();

Или даже так:

Person client = new Client("Tom", 500);

Person employee = new Employee ("Bob", "Операционист");

Но мы НЕ можем создать объект Person, используя конструктор класса Person:

Person person = new Person ("Bill");

 

// MyValue property

public int MyValue { get; set; }

 

private int age; // Field declaration

public int Age // Property declaration

{

get { return this.age; } // Getter declaration

}

 

public int Age

{

get { return this.age; }

set

{

// Take precaution: perform check for correctness

if (value < 0)

{

throw new ArgumentException(

"Invalid argument: Age should be a positive number.");

}

// Assign the new correct value

this.age = value;

}

}

 

 

Пример статического класса

public class Dog

{

// Static (class) variable

static int dogCount;

// Instance variables

private string name;

private int age;

}

public Dog(string name, int age)

{

this.name = name;

this.age = age;

// Modifying the static counter in the constructor

Dog.dogCount += 1;

}

Пример абстрактного класса

public abstract class Animal

{

public void PrintInformation()

{

Console.WriteLine("I am a {0}.", this.GetType().Name);

Console.WriteLine(GetTypicalSound());

}

public abstract void YouMustImplement();

 

  //If you derive from this class you can change the behavior but are not required to

public virtual void YouCanOverride()

{

}

 

protected abstract String GetTypicalSound();

}

 

public class Cat: Animal

{

protected override String GetTypicalSound()

{

return "Meoooow!";

}

}

Абстрактные члены классов не должны иметь модификатор private. При этом производный класс обязан переопределить и реализовать все абстрактные методы и свойства, которые имеются в базовом абстрактном классе. При переопределении в производном классе такой метод или свойство также объявляются с модификатором override (как и при обычном переопределении виртуальных методов и свойств). Также следует учесть, что если класс имеет хотя бы одный абстрактный метод (или абстрактные свойство, индексатор, событие), то этот класс должен быть определен как абстрактный.

Когда следует использовать абстрактные классы:

· Если надо определить общий функционал для родственных объектов

· Если нужно, чтобы все производные классы на всех уровнях наследования имели некоторую общую реализацию. При использовании абстрактных классов, если мы захотим изменить базовый функционал во всех наследниках, то достаточно поменять его в абстрактном базовом классе.

Когда следует использовать интерфейсы:

· Если нам надо определить функционал для группы разрозненных объектов, которые могут быть никак не связаны между собой.

· Если мы проектируем небольшой функциональный тип

·

Ключевыми здесь являются первые пункты, которые можно свести к следующему принципу: если классы относятся к единой системе классификации, то выбирается абстрактный класс. Иначе выбирается интерфейс. Посмотрим на примере.

Допустим, у нас есть система транспортных средств: легковой автомобиль, автобус, трамвай, поезд и т.д. Поскольку данные объекты являются родственными, мы можем выделить у них общие признаки, то в данном случае можно использовать абстрактные классы:

 

public abstract class Vehicle

{

public abstract void Move();

}

 

public class Car: Vehicle

{

public override void Move()

{

Console.WriteLine("Машина едет");

}

}

 

Абстрактный класс Vehicle определяет абстрактный метод перемещения Move(), а классы-наследники его реализуют.

Но, предположим, что наша система транспорта не ограничивается вышеперечисленными транспортными средствами. Например, мы можем добавить самолеты, лодки.

Вобщем получается довольно широкий круг объектов, которые связаны только тем, что являются транспортным средством и должны реализовать некоторый метод Move(), выполняющий перемещение.

Так как объекты малосвязанные между собой, то для определения общего для всех них функционала лучше определить интерфейс.

public interface IMovable

{

void Move();

}

 

public abstract class Vehicle

{}

 

public class Car: Vehicle, IMovable

{

public void Move()

{

Console.WriteLine("Машина едет");

}

}

 

public class Bus: Vehicle, IMovable

{

public void Move()

{

Console.WriteLine("Автобус едет");

}

}

 

public class Hourse: IMovable

{

public void Move()

{

Console.WriteLine("Лошадь скачет");

}

}

 

public class Aircraft: IMovable

{

public void Move()

{

Console.WriteLine("Самолет летит");

}

}

Теперь метод Move() определяется в интерфейсе IMovable, а конкретные классы его реализуют.

Говоря об использовании абстрактных классов и интерфейсов можно привести еще такую аналогию, как состояние и действие. Как правило, абстрактные классы фокусируются на общем состоянии классов-наследников. В то время как интерфейсы строятся вокруг какого-либо общего действия.

И так, для каждой разноплановой сущности можно было бы составить свою систему классов, исходяющую от определенного абстрактного класса. А для общего действия определить интерфейс, например, IHeatable, в котором бы был метод Heat, и этот интерфейс реализовать во всех необходимых классах.

 

Напишем программу которая управляет стилем шрифта текста выведенного на метке Label

 

 

Элемент ListBox представляет собой простой список. Ключевым свойством этого элемента является свойство Items, которое как раз и хранит набор всех элементов списка.

Элементы в список могут добавляться как во время разработки, так и программным способом. В Visual Studio в окне Properties (Свойства) для элемента ListBox мы можем найти свойство Items. После двойного щелчка на свойство нам отобразится окно для добавления элементов в список:

 

В пустое поле мы вводим по одному элементу списка - по одному на каждой строке. После этого все добавленные нами элементы окажутся в списке, и мы сможем ими управлять:

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...