|
ООП С Sharp - Использование наследования в C#
Пример, которым мы воспользуемся для демонстрации наследования, описывает некую воображаемую компанию сотовой связи под названием Mortimer Phones. Мы разработаем класс, представляющий счет абонента и отвечающий за калькуляцию его телефонных счетов. Это будет более длинный и сложный пример, чем класс Authenticator, и в процессе его разработки вы вскоре обнаружите, что одного простого класса окажется недостаточно; вместо этого понадобится множество взаимосвязанных классов. Наследование поможет справиться с задачей.
Разработаем класс, который должен будет генерировать ежемесячные счета для каждого клиента Mortimer Phones. Класс будут называться Customer, и каждый его экземпляр будет представлять один счет абонента.
терминах открытого интерфейса класс будет включать два свойства:
- Name — представляет имя абонента (доступно для чтения и записи).
- Balance — представляет сумму задолженности (только для чтения).
Класс будет иметь также два метода:
- RecordPayment() — вызывается, чтобы указать, что абонент внес определенную сумму оплаты своего счета.
- RecordCall() — вызывается, когда абонент выполняет телефонный звонок.
Вычисляет стоимость вызова и добавляет его к балансу абонента. Метод RecordCall() является достаточно сложной функцией, когда применяется в реальной жизни, потому что включает определение типа вызова по вызываемому номеру, применение определенного тарифа и сохранение хронологии вызовов. Для простоты предположим, что есть только два типа звонков: звонки на городские номера и звонки на другие сотовые телефоны, и стоимость разговора установлена 2 цента за минуту для городских номеров и 30 центов за минуту — для звонков на сотовые номера. Метод RecordCall() будет просто принимать тип звонка в качестве параметра, а о сохранении истории вызовов мы пока не будем заботиться.
С учетом этих допущений обратимся к коду проекта. Проект будет консольным приложением, и первое, что нам понадобится — перечисление типов звонков:
namespace CSharp.OOProg
{
using System;
public enum TypeOfCall
{
CallToCellPhone,
CallToLandline
}
Теперь обратимся к определению класса Customer, описывающего абонента:
public class Customer
{
private string name;
private decimal balance;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public decimal Balance
{
get
{
return balance;
}
}
public void RecordPayment(decimal amountPaid)
{
balance -= amountPaid;
}
public void RecordCall(TypeOfCall callType, uint nMinutes)
{
switch (callType)
{
case TypeOfCall.CallToLandline:
balance += (0.02M * nMinutes);
break;
case TypeOfCall.CallToCellPhone:
balance += (0.30M * nMinutes);
break;
default:
break;
}
}
}
Приведенный код самоочевиден и не требует подробных пояснений. Обратите внимание, что в программе жестко закодированы расценки в 2 цента за минуту (для звонков на городские номера) и 30 центов за минуту (для звонков на другие сотовые телефоны). В реальной жизни более вероятно, что они будут читаться из реляционной базы данных или некоторого файла, что позволит легко изменять эти значения.
Теперь добавим код в метод Main(), который отобразит суммы выставленных абонентам счетов:
public class MainEntryPoint
{
public static void Main()
{
Customer arabel = new Customer();
arabel.Name = "Arabel Jones";
Customer mrJones = new Customer();
mrJones.Name = "Ben Jones";
arabel.RecordCall(TypeOfCall.CallToLandline, 20);
arabel.RecordCall(TypeOfCall.CallToCellPhone, 5);
mrJones.RecordCall(TypeOfCall.CallToLandline, 10);
Console.WriteLine("{0,-20} owes ${1:F2}", arabel.Name,
arabel.Balance);
Console.WriteLine("{0,-20} owes ${1:F2}", mrJones.Name,
mrJones.Balance);
}
}
}
Выполнение этого кода даст следующий результат:
MortimerPhones Arabel Jones owes $1.90 Ben Jones owes $0.20
|