Questions
.pdf// requires that we're not already in an active call public void Dial(string n)
{
loop:
{
if (!battary)
{
Console.WriteLine("The battary is low. At first time you must recharge battary!");
Console.WriteLine("For this purpose press a key."); //Напоминаем о необходимости зарядить батарею //Нажатие клавиши - зарядка окончена
Console.ReadLine();
Charge_Battary(); goto loop;
}
if (!this.offHook)
{
Console.WriteLine("Phone must be switch-on before dialing."); return;
}
if (!m_on_zone)
{
Console.WriteLine("Out off-zone. Please? come back to station!"); Console.WriteLine("For this purpose press a key.");
//Напоминаем о необходимости нахождения трубки в зоне действия
станции
//Нажатие клавиши - вхождение в зону
Console.ReadLine(); this.OnZone(); goto loop;
}
if (m_activeCall)
{
Console.WriteLine("Already in a call."); return;
}
m_activeCall = true; Console.WriteLine("Dialing " + n);
}
}
}
}
----
using System; namespace Telephone
{
public class AutoDialer //Автоматический набор
{
public void Call(string[] numbers, string message, ITelephone phone)
{
foreach (string n in numbers)
{
phone.PickUpReceiver();// поднятие трубки phone.Dial(n);// набор
Console.WriteLine("Reading \"" + message + "\" to " + n);//Вывод на
консоль
phone.HangUpReceiver();// опускание трубки
}
}
}
class Telemarketer
{
static void Main()
{
POTSPhone t = new POTSPhone();//Объект класса POTSPhone, наследуемый интерфейс ITelephone
CordlessPhone c = new CordlessPhone();//Объект класса CordlessPhone,
наследуемый интерфейс ITelephone
string[] numbers = new string[4];//Создание массива
numbers[0] = "555-1211"; numbers[1] = "555-1212"; numbers[2] = "555-1213"; numbers[3] = "555-1214";
AutoDialer a = new AutoDialer();//Объект класса AutoDialer a.Call(numbers, "Hello. Am I interrupting dinner?", t);//Вызов метода
Call для объекта а, который принимает также аргумент типа любого класса который наследует интерфейс ITelephone
a.Call(numbers, "Hello. Am I interrupting dinner?", c);//Вызов метода
Call для объекта а, который принимает также аргумент типа любого класса который наследует интерфейс ITelephone
Console.Read();
}
}
}
2. Исследуйте наследование интерфейсов путем создания нового интерфейса, который унаследован от ITelephone и создайте новый класс, который реализует новый интерфейс (обратите внимание на то, что ваш новый класс должен реализовывать два интерфейса – новый интерфейс и интерфейс
ITelephone). Ваш новый интерфейс может быть специальным интерфейсом (для сотовых телефонов,
к примеру).
Пример:
using System;
using System.Collections.Generic; using System.Text;
namespace Telephone
{
public interface ITelephone
{
bool offHook
{
get;
}
void PickUpReceiver(); // поднятие трубки void HangUpReceiver(); // опускание трубки void Dial(string n); // циферблат
}
public interface ISotTelephone: ITelephone
{
void WriteSMS(); // набор сообщения bool rouming //Активность роуминга
{
get;
}
int accaunt //баланс на счету
{
get;
}
}
// POTSPhone implements the ITelephone interface public class POTSPhone : ITelephone
{
//private members holds state about the hook
//status of the receiver and if we're in a
//call or not.
private bool m_offHook;//Состояние поднятости трубки (поднята, опущена) private bool m_activeCall;//Состояние режима телефона (активный вызов и нет)
//read only property as required by ITelephone
//returns the boolean state of the hook status
//of the receiver.
public bool offHook
{
get { return m_offHook; }
}
//constructor to initialize the POTSPhone public POTSPhone()
{
m_offHook = false; m_activeCall = false;
}
//take the receiver
public void PickUpReceiver()
{
m_offHook = true;
}
//return the phone to on hook and end any
//active calls
public void HangUpReceiver()
{
m_offHook = false; m_activeCall = false;
}
//dial a phone number
//requires that the phone be off hook
//requires that we're not already in an active call public void Dial(string n)
{
if (!this.offHook)
{
Console.WriteLine("Phone must be off-hook before dialing."); return;
}
if (m_activeCall)
{
Console.WriteLine("Already in a call."); return;
}
m_activeCall = true;
Console.WriteLine("Dialing " + n);
}
}
public class CordlessPhone : ITelephone
{
//private members holds state about the hook
//status of the receiver and if we're in a
//call or not.
private bool m_on_off;//Состояние включенности трубки (включена, выключена) private bool m_activeCall;//Состояние режима телефона (активный вызов и нет) private bool m_on_zone;
private bool battary;
//read only property as required by ITelephone
//returns the boolean state of the hook status
//of the receiver. public bool offHook
{
get { return m_on_off; }
}
//constructor to initialize the POTSPhone public CordlessPhone()
{
battary = false;//Состояние заряда батареи
m_on_zone = false;//Состояние нахождения в зоне действия станции m_on_off = false;//Состояние трубки (вкл/выкл)
m_activeCall = false;//Состояние активного звонка
}
//take the receiver
public void PickUpReceiver()
{
m_on_off = true;
}
//return the phone to on hook and end any
//active calls
public void HangUpReceiver()
{
m_on_off = false; m_activeCall = false;
}
//Вхождение в зону действия станции public void OnZone()
{
m_on_zone = true;
}
//Процесс заряда батареи public void Charge_Battary()
{
battary = true;
}
//dial a phone number
//requires that the phone be off hook
//requires that we're not already in an active call public void Dial(string n)
{
loop:
{
if (!battary)
{
Console.WriteLine("The battary is low. At first time you must recharge battary!");
Console.WriteLine("For this purpose press a key."); //Напоминаем о необходимости зарядить батарею //Нажатие клавиши - зарядка окончена
Console.ReadLine();
Charge_Battary(); goto loop;
}
if (!this.offHook)
{
Console.WriteLine("Phone must be switch-on before dialing."); return;
}
if (!m_on_zone)
{
Console.WriteLine("Out off-zone. Please? come back to station!"); Console.WriteLine("For this purpose press a key.");
//Напоминаем о необходимости нахождения трубки в зоне действия
станции
//Нажатие клавиши - вхождение в зону
Console.ReadLine(); this.OnZone(); goto loop;
}
if (m_activeCall)
{
Console.WriteLine("Already in a call."); return;
}
m_activeCall = true; Console.WriteLine("Dialing " + n);
}
}
}
public class MobileFone: ISotTelephone
{
//private members holds state about the hook
//status of the receiver and if we're in a
//call or not.
private bool m_on_off;//Состояние включенности трубки (включена, выключена) private bool m_activeCall;//Состояние режима телефона (активный вызов и нет) private bool m_on_zone;//Факт нахождения в зоне покрытия
private bool battary;//Уровень заряда батареи private bool sms;//текст сообщения
public bool Rouming;//роуминг
private int balance;//размер суммы на сету
private const int price_by_sms = 5;//цена за одно sms
//read only property as required by ITelephone
//returns the boolean state of the hook status
//of the receiver. public bool offHook
{
get { return m_on_off; }
}
public bool rouming
{
get {return Rouming; }
}
public int accaunt
{
get {return balance; }
}
//constructor to initialize the POTSPhone public MobileFone()
{
battary = false;//Состояние заряда батареи
m_on_zone = false;//Состояние нахождения в зоне действия станции m_on_off = false;//Состояние трубки (вкл/выкл)
m_activeCall = false;//Состояние активного звонка sms =false;//текст сообщения
Rouming =false;//роуминг balance =0;//состояние счета
}
//take the receiver
public void PickUpReceiver()
{
m_on_off = true;
}
//return the phone to on hook and end any
//active calls
public void HangUpReceiver()
{
m_on_off = false; m_activeCall = false;
}
//Вхождение в зону действия станции public void OnZone()
{
m_on_zone = true;
}
//Процесс заряда батареи public void Charge_Battary()
{
battary = true;
}
public void sms_go()
{
balance -= price_by_sms;
}
public void add_balance()
{
string s;
Console.WriteLine("Для пополнения cчета введите сумму цифрами:"); s = Console.ReadLine();
balance += (Convert.ToInt32(s));
Console.WriteLine("На Вашем счету "+accaunt+ " единиц"); return;
}
public void WriteSMS() // набор и отправка сообщения
{
loop:
if (sms)
{
if (rouming)
{
if (accaunt >= (10 * price_by_sms))
{
Console.WriteLine("Сообщение отправлено"); sms = false;
sms_go(); return;
}
else
Console.WriteLine("Недостаточно денег для отправки сообщения. Пополните Ваш счет.");
add_balance(); goto loop;
}
else
if (accaunt >= price_by_sms)
{
Console.WriteLine("Сообщение отправлено"); Console.ReadLine(); sms = false;
sms_go(); return;
}
else
{
Console.WriteLine("Недостаточно денег для отправки сообщения.
Пополните Ваш счет.");
add_balance(); goto loop;
}
}
else
{
Console.WriteLine("Для отправки сообщения, наберите его текст:\n" + "для этого нажмите любую клавишу");
Console.ReadLine();// Console.Read(); sms = true;
goto loop;
}
}
//dial a phone number
//requires that the phone be off hook
//requires that we're not already in an active call public void Dial(string n)
{
loop:
{
if (!battary)
{
Console.WriteLine("The battary is low. At first time you must recharge battary!");
Console.WriteLine("For this purpose press a key."); //Напоминаем о необходимости зарядить батарею //Нажатие клавиши - зарядка окончена
Console.ReadLine();
Charge_Battary(); goto loop;
}
if (!this.offHook)
{
Console.WriteLine("Phone must be blockoff before dialing."); return;
}
if (!m_on_zone)
{
Console.WriteLine("Out off-zone."); Console.WriteLine("For this purpose press a key.");
//Напоминаем о необходимости нахождения трубки в зоне действия
станции
//Нажатие клавиши - вхождение в зону
Console.ReadLine(); this.OnZone(); goto loop;
}
if (m_activeCall)
{
Console.WriteLine("Already in a call."); return;
}
m_activeCall = true; Console.WriteLine("Dialing " + n);
}
}
}
}
-----
using System; namespace Telephone
{
public class AutoDialer //Автоматический набор
{
public void Call(string[] numbers, string message, ITelephone phone)
{
foreach (string n in numbers)
{
phone.PickUpReceiver();// поднятие трубки phone.Dial(n);// набор
Console.WriteLine("Reading \"" + message + "\" to " + n);//Вывод на
консоль
phone.HangUpReceiver();// опускание трубки
}
}
}
class Telemarketer
{
static void Main()
{
POTSPhone t = new POTSPhone();//Объект класса POTSPhone, наследуемый интерфейс ITelephone
CordlessPhone c = new CordlessPhone();//Объект класса CordlessPhone,
наследуемый интерфейс ITelephone
MobileFone m = new MobileFone();// Объект класса MobileFone string[] numbers = new string[4];//Создание массива
numbers[0] = "555-1211"; numbers[1] = "555-1212"; numbers[2] = "555-1213"; numbers[3] = "555-1214";
AutoDialer a = new AutoDialer();//Объект класса AutoDialer a.Call(numbers, "Hello. Am I interrupting dinner?", t);//Вызов метода
Call для объекта а, который принимает также аргумент типа любого класса который наследует интерфейс ITelephone
Console.Read();
a.Call(numbers, "Hello. Am I interrupting dinner?", c);//Вызов метода
Call для объекта а, который принимает также аргумент типа любого класса который наследует интерфейс ITelephone
Console.Read();
a.Call(numbers, "Hello. Am I interrupting dinner?", m);//Вызов метода
Call для объекта а, который принимает также аргумент типа любого класса который наследует интерфейс ITelephone
//m.add_balance(); m.Rouming = true; m.WriteSMS();
Console.Read(); Console.WriteLine("На Вашем счету осталось "+m.accaunt+ "
единиц");
Console.ReadLine(); Console.ReadLine();
}
}
}
Опубликуйте ваш новый класс и интерфейс на форуме.
В данной программе реализован новый интерфейс IsotTelephone, который наследует интерфейс Itelephone. В новом интерфейсе описан метод WriteSMS() (написание сообщения),
свойство rouming (определяющий тарифы связи) и свойство accaunt (сумма на счету).
В классе MobileFone реализуется метод WriteSMS() таким образом, что для написания и отправки смс автоматически проверяется состояние смс-редактора: если смс уже пишется, то начать писать новое невозможно. Также мы не можем отправить смс в случае когда оно не написано. То-есть для его отправки необходимо активизировать смс-редактор. Когда же смс готово мы можем его отправить только в том случае, если колличество денежных единиц на счету как минимум равно стоимости отправки одного смс учитывая местные расценки,
колторые, в свою очередь, зависят от активности роуминга. Если роуминг активен, то тарифы на связь возростают в 10 раз. Мы можем пополнять счет на любую сумму путем ввода ее с