Программирование на C# (Си Шарп) - ООП в .NET - Использование наследования в C#

Программирование на C# - ООП C#

ООП С 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

 

Добавить комментарий


Защитный код
Обновить