Для створення бібліотеки треба при розробці проекту в середовищі Visual Studio.NET вибрати шаблон Class Library (бібліотека класів). В розділі 8 була створена проста ієрархія класів персонажів комп'ютерної гри. У цьому розділі ми оформимо її у вигляді бібліотеки, тобто збірки з розширенням dll. Для збірки задано ім'я MonsterLib (рис. 12.2).
Рис. 12.2. Створення бібліотеки
Текст модуля приведений в лістингу 12.1. В порівнянні з модулем з розділу 8 в нього додані специфікатори доступу public для всіх трьох класів, що входять в бібліотеку.
Лістинг 12.1. Бібліотека монстрів
namespace MonsterLib
{
using System;
public abstract class Spirit
{
public abstract void Passport();
}
public class Monster : Spirit
{
public Monster()
{
this.name = "Noname";
this.health = 100;
this.ammo = 100;
}
public Monster(string name)
: this()
{
this.name = name;
}
public Monster(int health, int ammo, string name)
{
this.name = name;
this.health = health;
this.ammo = ammo;
}
public int Ammo
{
get { return ammo; }
set
{
if (value > 0) ammo = value; else ammo = 0;
}
}
public int Health
{
get { return health; }
set
{
if (value > 0) health = value; else health = 0;
}
}
override public void Passport()
{
Console.WriteLine("Monster {0} \t health = {1} ammo = {2}", name, health, ammo);
}
public string name; // закриті поля
public int health, ammo;
}
public class Daemon : Monster
{
public Daemon()
{
brain = 1;
}
public Daemon(string name, int brain)
: base(name) // 1
{
this.brain = brain;
}
public Daemon(int health, int ammo, string name, int brain)
: base(health, ammo, name)
{
this.brain = brain;
}
override public void Passport()
{
Console.WriteLine(
"Daemon {0} \t health = {1} ammo = {2} brain = {3}",
name, health, ammo, brain);
}
public void Think()
{
Console.Write( name + " is");
for (int i = 0; i < brain; ++i);
Console.Write( " thinking");
Console.WriteLine("...");
}
int brain; // закрите поле
}
}
Скомпілювавши бібліотеку, ви виявите файл Monsterlib.dll у каталогах ...\bin\ Debug і ...\obj\Debug. Відкривши файл Monsterlib.dll за допомогою програми ILdasm.exe, можна отримати повну інформацію про створену бібліотеку (рис. 12.3).
Рис. 12.3. Перегляд бібліотеки за допомогою дизасемблера Lidasm.exe
Будь-яка бібліотека - це сервер, що надає свої ресурси клієнтам. Створимо клієнтське застосування, що виконує ті ж функції, що і додаток з розділу “Віртуальні методи” (див. розділ 8, лістінг 8.3), але з використанням бібліотеки Monsterlib.dll. Для того, щоб компілятор міг її виявити, необхідно після створення проекту (як завжди, це - консольний додаток) підключити посилання на бібліотеку за допомогою команди Project > Add Reference (Додати посилання). Для пошуку каталогу, що містить бібліотеку, слід використовувати кнопку Browse.
Після підключення бібліотеки можна користуватися її відкритими елементами таким же чином, неначебто вони були описані в тому ж модулі. Текст додатку приведений в лістингу 12.2.
Лістинг 12.2. Клієнтське застосування
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace exam100
{
using MonsterLib;
class Program
{
static void Main(string[] args)
{
const int n = 3;
Monster[] stado = new Monster[n];
stado[0] = new Monster( "Monia" );
stado[1] = new Monster( "Monk" );
stado[2] = new Daemon ( "Dimon", 3 );
foreach ( Monster elem in stado ) elem. Passport();
for ( int i = 0; i < n; ++i ) stado[i].Ammo = 0;
Console.WriteLine();
foreach ( Monster elem in stado ) elem.Passport();
}
}
}
Результат роботи програми:
Monster Monia health = 100 ammo = 100
Monster Monk health = 100 ammo = 100
Monster Dimon health = 100 ammo = 100 brain = 3;
Monster Monia health = 100 ammo = 0
Monster Monk health = 100 ammo = 0
Monster Dimon health = 100 ammo = 0 brain = 3;
Перевага .NET полягає в тому, що завдяки стандартним угодам можна використовувати бібліотеки незалежно від мови, на якій вони були написані. Таким чином, можна було б написати клієнтське застосування, наприклад, на мові VB.NET.