После создания проекта и решения вы можете открыть его в Visual Studio (или Visual Studio Code), чтобы приступить к построению классов. Открыв решение, удалите автоматически сгенерированный файл
Class1.cs
. Проектное решение библиотеки для работы с автомобилями начинается с создания перечислений
EngineStateEnum
и
MusicMediaEnum
. Добавьте в проект два файла с именами
MusicMediaEnum.cs
и
EngineStateEnum.cs
и поместите в них следующий код:
// MusicMediaEnum.cs
namespace CarLibrary
{
// Тип музыкального проигрывателя, установленный в данном автомобиле.
public enum MusicMediaEnum
{
MusicCd,
MusicTape,
MusicRadio,
MusicMp3
}
}
// EngineStateEnum.cs
namespace CarLibrary
{
// Представляет состояние двигателя.
public enum EngineStateEnum
{
EngineAlive,
EngineDead
}
}
Далее создайте абстрактный базовый класс по имени
Car
, который определяет разнообразные данные состояния через синтаксис автоматических свойств. Класс
Car
также имеет единственный абстрактный метод
TurboBoost()
, в котором применяется специальное перечисление (
EngineState
), представляющее текущее состояние двигателя автомобиля. Вставьте в проект новый файл класса C# по имени
Car.cs
со следующим кодом:
namespace CarLibrary
{
// Абстрактный базовый класс в иерархии.
public abstract class Car
{
public string PetName {get; set;}
public int CurrentSpeed {get; set;}
public int MaxSpeed {get; set;}
protected EngineStateEnum State = EngineStateEnum.EngineAlive;
public EngineStateEnum EngineState => State;
public abstract void TurboBoost();
protected Car(){}
protected Car(string name, int maxSpeed, int currentSpeed)
{
PetName = name;
MaxSpeed = maxSpeed;
CurrentSpeed = currentSpeed;
}
}
}
Теперь предположим, что есть два непосредственных потомка класса
Car
с именами
MiniVan
(минивэн) и
SportsCar
(спортивный автомобиль). В каждом из них абстрактный метод
TurboBoost()
переопределяется для отображения подходящего сообщения в окне консоли. Вставьте в проект два новых файла классов C# с именами
MiniVan.cs
и
SportsCar.cs
. Поместите в них показанный ниже код:
// SportsCar.cs
using System;
namespace CarLibrary
{
public class SportsCar : Car
{
public SportsCar(){ }
public SportsCar(
string name, int maxSpeed, int currentSpeed)
: base (name, maxSpeed, currentSpeed){ }
public override void TurboBoost()
{
Console.WriteLine("Ramming speed! Faster is better...");
}
}
}
// MiniVan.cs
using System;
namespace CarLibrary
{
public class MiniVan : Car
{
public MiniVan(){ }
public MiniVan(
string name, int maxSpeed, int currentSpeed)
: base (name, maxSpeed, currentSpeed){ }
public override void TurboBoost()
{
// Минивэны имеют плохие возможности ускорения!
State = EngineStateEnum.EngineDead;
Console.WriteLine("Eek! Your engine block exploded!");
}
}
}
Исследование манифеста
Перед использованием
CarLibrary.dll
в клиентском приложении давайте посмотрим, как библиотека кода устроена внутри. Предполагая, что проект был скомпилирован, запустите утилиту
ildasm.exe
со скомпилированной сборкой. Если у вас нет утилиты
ildasm.exe
(описанной ранее в книге), то она также находится в каталоге для настоящей главы внутри хранилища GitHub.