КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Пример описания, реализации и использования интерфейса
Пример описывает банковский счет. Предположим, программируется код, который в конечном итоге обеспечит компьютеризованный перевод денег между банковскими и личными счетами. Предположим, что существует множество компаний, которые могут peaлизовать банковские счета, но все они согласились с тем, что любые классы, представляющие банковские счета, должны реализовывать интерфейс IBankAccount, имеющий методы для внесения и съема денежных сумм, а также свойство Balance –сумма на счету. Для начала потребуется определить интерфейс IBankAccount: public interface IBankAccount { void PayIn(decimal amount); //добавить деньги на счет bool Withdraw(decimal amount); //снять деньги со счета decimal Balance //свойство баланс, связано с данным balance- сумма на счету { get; //В свойстве описываются только блоки get set, но не реализовываются! } } Идея заключается в том, что теперь вы имеете возможность писать классы, представляющие банковские счета. Эти классы не должны быть как-то связанными друг с другом; они могут быть полностью различными. Однако все они декларируют свое представление банковских счетов тем, что реализуют интерфейс IBankAccount. Допустим, первый класс описывает сберегательный счет в Беларусбанке: public class BelarusAccount: IBankAccount //обратите внимание на объявление { private decimal balance; //данное класса – только в классе! public void PayIn(decimal amount) { balance += amount; } public bool Withdraw(decimal amount) { if (balance >= amount) { balance -= amount; return true; } else Console.WriteLine("Попытка перевода денег не удалась!");
return false; } public decimal Balance { get { return balance; } } public override string ToString() { return String.Format("Беларусбанк: Баланс = {0,6:С}", balance); } } В классе создается приватное поле balance и изменяется сумма остатка, указанная в нем, при съеме и зачислении денег на счет. Если предпринимается попытка снять больше денег, чем осталось на счету, выдается сообщение об ошибке. Отметим, что для простоты кода здесь не реализуются дополнительные свойства, такие как имя владельца счета и др. Чтобы проиллюстрировать, как различные классы могут реализовать один и тот же интерфейс, предположим, что ПриорБанк также реализует собственный класс, представляющий банковские счета — PriorAccount: public class PriorAccount: IBankAccount {…} // Реализация основной программы … static void Main() { //обратите внимание на объявление экземпляров классов! //Это ссылки на интерфейс!!! IBankAccount Bel = new BelarusAccount(); IBankAccount Prior= new PriorAccount(); Bel.PayIn(200); Bel.Withdraw(100); Console.WriteLine(Bel.ToString()); Prior.PayIn(500); Prior.Withdraw(600); Prior.Withdraw(100); Console.WriteLine(Prior.ToString()); } Главный момент, который следует здесь отметить — способ объявления экземпляров как ссылок на IBankAccount. Это значит, что они могут указывать на любой экземпляр любого класса, реализующего интерфейс. Это также означает, что через эти ссылки вы можете вызывать только те методы, которые являются частью интерфейса. Если вам понадобится вызвать любые методы, реализованные классом, но не являющиеся частью интерфейса, то придется выполнить приведение ссылки к соответствующему типу. Пример: Допустим, класс BelarusAccount имеет еще метод: public void f() {…} Если в основной программе записать строчку: Bel.f(); //Компилятор выдаст ошибку!!!, так как Bel-ссылка на интерфейс! Для того, чтобы вызвать метод f() класса BelarusAccount необходимо привести переменную Bel к типу класса BelarusAccount через новую переменную х: BelarusAccount x=(BelarusAccount)Bel; //явное приведение типов Теперь можно вызвать метод f(), используя эту новую переменную: x.f(); Для метода ToString () (не объявленный в интерфейсе IBankAccount) не требуется никакого явного приведения типов, просто потому, что ToString () — это метод System.Object,поэтому компилятор С# знает о том, что он поддерживается любым классом. Можно также создавать массивы интерфейсов, элементы которых являются экземплярами разных классов: IBankAccount [] mas = new IBankAccount[2]; mas[0] = new BelarusAccount (); mas[1] = new PriorAccount();…
Интерфейсы могут быть унаследованы друг от друга — точно так же, как это делают классы.
Рассмотрим применение интерфейсов на примере класса Monster, описанного в лекции 14. Пусть в классе Monster будет реализован интерфейс IAction, в котором собраны все действия, которые может совершить монстр в игре. namespace ConsoleApplication1 {
Дата добавления: 2014-01-04; Просмотров: 323; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |