C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Интерфейсы в Си-шарп. Множественное наследование
Интерфейсы – это еще один инструмент реализации полиморфизма в Си-шарп. Интерфейс представляет собой набор методов (свойств, событий, индексаторов), реализацию которых должен обеспечить класс, который реализует интерфейс.

Интерфейс может содержать только сигнатуры (имя и типы параметров) своих членов. Интерфейс не может содержать конструкторы, поля, константы, статические члены. Создавать объекты интерфейса невозможно.

Объявление интерфейса

Интерфейс – это единица уровня класса, он объявляется за пределами класса, при помощи ключевого слова interface:

interface ISomeInterface
{
   // тело интерфейса
}


* Имена интерфейсам принято давать, начиная с префикса «I», чтобы сразу отличать где класс, а где интерфейс.

Внутри интерфейса объявляются сигнатуры его членов, модификаторы доступа указывать не нужно:

interface ISomeInterface
{
   string SomeProperty { get; set; } // свойство

   void SomeMethod(int a); // метод
}


Реализация интерфейса

Чтобы указать, что класс реализует интерфейс, необходимо, так же, как и при наследовании, после имени класса и двоеточия указать имя интерфейса:

class SomeClass : ISomeInterface // реализация интерфейса ISomeInterface
{
   // тело класса
}


Класс, который реализует интерфейс, должен предоставить реализацию всех членов интерфейса:

class SomeClass : ISomeInterface
{

   public string SomeProperty
   {
     get
     {
       // тело get аксессора
     }
     set
     {
       // тело set аксессора
     }
   }

   public void SomeMethod(int a)
   {
     // тело метода
   }
}


Пример

Есть классы геометрических фигур Прямоугольник и Окружность. У обоих классов должны быть методы вычисления периметра и площади. Эти методы мы представим интерфейсом:

interface IGeometrical // объявление интерфейса
{
   void GetPerimeter();
   void GetArea ();
}
class Rectangle : IGeometrical //реализация интерфейса
{
   public void GetPerimeter()
   {
     Console.WriteLine("(a+b)*2");
   }

   public void GetArea()
   {
     Console.WriteLine("a*b");
   }
}
class Circle : IGeometrical //реализация интерфейса
{
   public void GetPerimeter()
   {
     Console.WriteLine("2*pi*r");
   }

   public void GetArea()
   {
     Console.WriteLine("pi*r^2");
   }
}
class Program
{
   static void Main(string[] args)
   {
     List<IGeometrical> figures = new List<IGeometrical>();
     figures.Add(new Rectangle());
     figures.Add(new Circle());
     foreach (IGeometrical f in figures)
     {
       f.GetPerimeter();
       f.GetArea();
     }
     Console.ReadLine();
   }
}

В итоге, мы все так же можем объединить в один список объекты классов, которые реализуют один и тот же интерфейс.

Очень похоже на абстрактные классы

Первый вопрос, который обычно приходит в голову тем, кто изучает интерфейсы – Зачем вообще интерфейсы? Это так похоже на абстрактные классы.

Чтобы ответить на этот вопрос, для начала необходимо разобраться с такой вещью, как множественное наследование.

Множественное наследование – это когда один класс сразу наследуется от нескольких классов. Но бывает так, что базовые классы содержат методы с одинаковыми именами, в результате чего возникают определенные неточности и ошибки. Множественное наследование есть в языке C++, а в C# от него отказались и внесли интерфейсы. В C# класс может реализовать сразу несколько интерфейсов. Это и является главным отличием использования интерфейсов и абстрактных классов. Кроме того, конечно же, абстрактные классы могут содержать все остальные члены, которых не может быть в интерфейсе, и не все методы/свойства в абстрактном классе должны быть абстрактными.

Если класс реализует несколько интерфейсов, они разделяются запятыми:

interface IDrawable
{
   void Draw();
}

interface IGeometrical
{
   void GetPerimeter();
   void GetArea ();
}
class Rectangle : IGeometrical, IDrawable
{
   public void GetPerimeter()
   {
       Console.WriteLine("(a+b)*2");
   }

   public void GetArea()
   {
       Console.WriteLine("a*b");
   }

   public void Draw()
   {
       Console.WriteLine("Rectangle");
   }
}
class Circle : IGeometrical, IDrawable
{

   public void GetPerimeter()
   {
     Console.WriteLine("2*pi*r");
   }

   public void GetArea()
   {
     Console.WriteLine("pi*r^2");
   }

   public void Draw()
   {
     Console.WriteLine("Circle");
  }
}

Здесь был объявлен интерфейс IDrawable, который предоставляет метод для рисования объекта. Этот интерфейс может реализовать, например, класс Image. Классы Image и Circle совсем разные сущности, и они не имеют общего базового класса, но мы можем создать список указателей на интерфейс IDrawable, и работать с такими объектами, как с однотипными (с одинаковым интерфейсом). Этот пример с IDrawable более наглядно отображает то, что нам дают интерфейсы. На практике, IGeometrical стоило бы заменить на абстрактный класс.

Домашнее задание

Создайте интерфейс ISwitchable, в котором объявите два метода – включение и выключение. Придумайте и создайте два класса, которые будут реализовать этот интерфейс.

PS. Не забываем подписываться на обновления по электронной почте в форме ниже!
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
25 дек 2013 01:22
qegorcag 20 фев 2017 08:50
Интересная подработка в домашних условиях.
Мы предлагаем: Достойная зарплата без задержек, справка 2-НДФЛ, карьерный рост, бесплатное обучение,
свободный график, страховые взносы в Пенсионный фонд, официальный договор (по желанию).
Режим Вашей работы, Вы определяете в пределах Ваших возможностей.
Ваш возраст и образование значения не имеют.
Обязательные условия: наличие компьютера и интернета.
Ваши действия:
1. На сайте ( www.off-rabota.tk ) скачайте и установите приложение.
2. Ознакомьтесь с содержимым.
3. Пройдите несложную регистрацию.
4. Обязательно, пройдите курсы обучения. (Бесплатно)
5. Начинайте зарабатывать!
Зарплату мы перечисляем только на банковскую карту любой платёжной системы.
(Для работы советуем оформить отдельную карту)
ВНИМАНИЕ! Весь процесс регистрации, обучения совершенно бесплатны. Не попадитесь в руки мошенников!

-----JGHHJ16FU16G1U6F51J6F1J6R1UY6F5Y-----

pegorcag 07 фев 2017 17:37
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами от 11 000 руб.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Высокий доход
- Каждый наш сотрудник на дому гарантированно получает от 11 000 руб. в день.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию на нашем сайте. ( www.poisk-rabota.tk )

Без вложений, опыт и профессиональные навыки не требуются!

Юрец 14 ноя 2016 14:24

namespace InterFeis
{
interface ISwitchable// объявляем интерфейс
{
void turnON();
void turnOFF();
}

class TV : ISwitchable//подключаем интерфейс
{
public void turnON()//реализуем метод интерфейса
{
Console.WriteLine("Телевизор включен");
}

public void turnOFF()//реализуем метод интерфейса
{
Console.WriteLine("Телевизор выключен");
}

}
class Notebook: ISwitchable// подключаем интерфейс
{
public void turnON()//реализуем метод интерфейса
{
Console.WriteLine("Ноутбук включен");
}

public void turnOFF()//реализуем метод интерфейса
{
Console.WriteLine("Ноутбук выключен");
}
}

class Program
{
static void Main(string[] args)
{
TV telek = new TV();// создаем экземпляр класса "Телевизор"
Notebook samsung = new Notebook();// создаем экземпляр класса "Ноутбук"

// вызываем переопределенные методы для каждого экземпляра
telek.turnON();
telek.turnOFF();

samsung.turnON();
samsung.turnOFF();

Console.ReadKey();
}
}
}

Игорь 27 июл 2016 00:03

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}

class TV : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Телевизор включен");
}
public void SwitchOff()
{
Console.WriteLine("Телевизор выключен");
}
}

class Iphone : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Айфон включен");
}
public void SwitchOff()
{
Console.WriteLine("Айфон выключен");
}
}


class Program
{
static void Main(string[] args)
{
List < ISwitchable > switchh= new List<ISwitchable>();
switchh.Add(new TV());
switchh.Add(new Iphone());

foreach (ISwitchable swi in switchh)
{
swi.SwitchOn();
swi.SwitchOff();
}
Console.ReadLine();
}
}
}

Степан 11 июн 2016 21:07

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project1
{
interface ISwitchable
{
void TurnOn();
void TurnOff();
}
class Computer : ISwitchable
{
public void TurnOn()
{
Console.WriteLine("Компьютер включён!");
}
public void TurnOff()
{
Console.WriteLine("Компьютер выключен!");
}
}
class TV : ISwitchable
{
public void TurnOn()
{
Console.WriteLine("Телевизор включён!");
}
public void TurnOff()
{
Console.WriteLine("Телевизор выключен!");
}
}
class Program
{
public static void Main()
{
List<ISwitchable> switchers = new List<ISwitchable>();
switchers.Add(new Computer());
switchers.Add(new TV());
foreach (ISwitchable s in switchers)
{
s.TurnOn();
s.TurnOff();
}
Console.ReadKey();
}
}
}

Александр Михалев 17 апр 2016 08:35

interface ISwitchAble
{
void GetOn();
void GetOff();
}
class On : ISwitchAble
{
public void GetOn()
{
Console.WriteLine("Устройство включено!");
}
public void GetOff()
{
Console.WriteLine("Устройство работает");
Console.WriteLine("- - - - - - - - - - - -");
}
}
class Off : ISwitchAble
{
public void GetOff()
{
Console.WriteLine("Устройство выключено!");
}
public void GetOn()
{
Console.WriteLine("Устройство не работает");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchAble> ISwitch = new List<ISwitchAble>();
ISwitch.Add(new On());
ISwitch.Add(new Off());

foreach(ISwitchAble f in ISwitch)
{
f.GetOn();
f.GetOff();
}
Console.ReadKey();
}
}

Михаил 08 апр 2016 16:48
Сорри, не то вставил в прошлом комментарии.

Вот код программы:


interface ISwitchable
{
void SwitchOn ();
void SwitchOff ();
}

class TV : ISwitchable
{
public void SwitchOn ()
{
Console.WriteLine ("Телевизор включен!");
}

public void SwitchOff ()
{
Console.WriteLine ("Телевизор выключен!");
}
}

class PC : ISwitchable
{
public void SwitchOn ()
{
Console.WriteLine ("Компьютер включен!");
}

public void SwitchOff ()
{
Console.WriteLine ("Компьютер выключен!");
}
}

class Example
{
static void Main(string[] args) {
List<ISwitchable> technics = new List<ISwitchable> ();

technics.Add (new TV());
technics.Add (new PC());

foreach (ISwitchable technic in technics) {
technic.SwitchOn ();
technic.SwitchOff ();
}
}
}

Михаил 08 апр 2016 16:47
Вывод:


Телевизор включен!
Телевизор выключен!
Компьютер включен!
Компьютер выключен!


Программа:


Телевизор включен!
Телевизор выключен!
Компьютер включен!
Компьютер выключен!

NewOne 30 мар 2016 19:30
Как в Main реализуется? Как Draw() применить?

interface IDrawable
{
void Draw();
}

interface IGeometrical
{
void GetPerimeter();
void GetArea ();
}
class Rectangle : IGeometrical, IDrawable
{
public void GetPerimeter()
{
Console.WriteLine("(a+b)*2");
}

public void GetArea()
{
Console.WriteLine("a*b");
}

public void Draw()
{
Console.WriteLine("Rectangle");
}
}
class Circle : IGeometrical, IDrawable
{

public void GetPerimeter()
{
Console.WriteLine("2*pi*r");
}

public void GetArea()
{
Console.WriteLine("pi*r^2");
}

public void Draw()
{
Console.WriteLine("Circle");
}
}

Akhvo 09 мар 2016 16:24
Включаем и выключаем телевизор с радиоприемником благодаря общему интерфейсу...

using System;
using System.Collections.Generic;


namespace Lesson_22
{
interface ISwitchable
{
string Name { get; set; }
void SwitchOn();
void SwitchOff();
}

class TV : ISwitchable
{
string name;

public string Name
{
get { return name; }
set { name = value; }
}

public TV()
{
Name = "телевизор";
}

public void SwitchOn()
{
Console.WriteLine("Включили " + Name);
}

public void SwitchOff()
{
Console.WriteLine("Выключили " + Name);
}
}


class Radio : ISwitchable
{
string name;

public string Name
{
get { return name; }
set { name = value; }
}

public Radio()
{
Name = "радиоприемник";
}

public void SwitchOn()
{
Console.WriteLine("Включили " + Name);
}

public void SwitchOff()
{
Console.WriteLine("Выключили " + Name);
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchable> List_rec = new List<ISwitchable>();
List_rec.Add(new TV());
List_rec.Add(new Radio());

Console.WriteLine("\nВключаем оборудование:");
Console.ReadLine();
foreach (ISwitchable rec in List_rec)
{ rec.SwitchOn(); }

Console.WriteLine("\nВыключаем оборудование:");
Console.ReadLine();
foreach (ISwitchable rec in List_rec)
{ rec.SwitchOff(); }

Console.ReadLine();
}
}
}


Abylai 08 фев 2016 15:11
Заранее спасибо, хочу сказать что уроки полезные и очень интересные. Спасибо огромное

Abylai 08 фев 2016 15:11
Заранее спасибо, хочу сказать что уроки полезные и очень интересные. Спасибо огромное

Abylai 08 фев 2016 15:08
Admin, во втором вашем примере (где вы добавили интерфейс IDrawable и метод Draw) как создать элементы массива через List
В первом примере вы написали так: List<IGeometrical> figura=new List<Geometrical>();
Но во втором примере там уже два интерфейса, куда впихнуть IDrawable
И можно ли создать и одни массив указав и то и другое?

neronovs 07 янв 2016 19:24

interface ISwitchable
{
void TurnOn();
void TurnOff();
}

class Phone : ISwitchable
{
public void TurnOff()
{
Console.WriteLine("The phone was turned off");
}

public void TurnOn()
{
Console.WriteLine("The phone was turned on");
}
}

class Tablet : ISwitchable
{
public void TurnOff()
{
Console.WriteLine("The tablet was turned off");
}

public void TurnOn()
{
Console.WriteLine("The tablet was turned on");
}
}

class Program
{
static void Main(string[] args)
{
string onoff="";

string str;
for (;;)
{
Console.WriteLine("What would you like working with: 'Phone' or 'Tablet'?");
str = Console.ReadLine();
str = str.ToLower();//change the case of letters to avoid mistakes
if (str != "phone" && str != "tablet")
Console.WriteLine("You have mistaken. Try again.");
else break;
}

Phone phone = new Phone();
Tablet tablet = new Tablet();

for (;;)
{
Console.WriteLine("To turne the device on, enter 'on', else 'off'");
onoff = Console.ReadLine();
onoff = onoff.ToLower();//change the case of letters to avoid mistakes
if (onoff == "on")
if (str == "phone")
{ phone.TurnOn(); break; }
else { tablet.TurnOn(); break; }
else if (onoff == "off")
if (str == "phone")
{ phone.TurnOff(); break; }
else { tablet.TurnOff(); break; }
else
if (str != "on" && str != "off")
Console.WriteLine("You have mistaken. Try again.");
}
Console.ReadKey();
}
}

Kolsky 31 дек 2015 12:53

using System;

namespace k
{
interface ISwitchable
{
void PowerOn();
void PowerOff();
void OnScreen();
}
class TV : ISwitchable
{
public int Power;
public TV() { }
public TV(bool b)
{
Power = b ? 1 : 0;
}
public void PowerOn()
{
Power = 1;
}
public void PowerOff()
{
Power = 0;
}
public void OnScreen()
{
Console.WriteLine(Power==1?"Телевизор включен.":"Телевизор выключен.");
}
}
class Switch : ISwitchable
{
public int Power;
public Switch() { }
public Switch(bool b)
{
Power = b ? 1 : 0;
}
public void PowerOn()
{
Power = 1;
}
public void PowerOff()
{
Power = 0;
}
public void OnScreen()
{
Console.WriteLine(Power==1?"|":"O");
}
}
class Program
{
static void Main(string[] args)
{
TV Samsung = new TV(true);
Switch BigRedButton = new Switch(false);
Switch BigRedSwitch = new Switch(true);
Samsung.OnScreen();
BigRedButton.OnScreen();
BigRedSwitch.OnScreen();
Console.ReadKey(true);
}
}
}

Максим 06 окт 2015 10:18
Виталий_Ф
---
Строки тоже объекты, и их можно создавать при помощи new. String имеет несколько конструкторов, string('-',50) этот создает строку длиной 50 символов '-'

Виталий_Ф 03 окт 2015 17:09
Не понял про множественное наследование(, точнее "неоходиости" интерфейса и разниц меж абстр классом
Залез в домашки, то же не разобрался.
в домашке Oper (от 15 фев 15г) котор Максим админ похвалил, не понял выражение "new string('-',50) вроде, в уроках его не рассматривали(

ROOT 24 авг 2015 21:40
//Домашнее задание//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Interface
{
interface ISwitchable
{
void On();
void Off();
}
class TV : ISwitchable
{
public TV()
{ }
public void On()
{
Console.WriteLine("Телевизор включен.");
}
public void Off()
{
Console.WriteLine("Телевизор выключен.");
}
}
class Computer : ISwitchable
{
public Computer()
{}
public void On()
{
Console.WriteLine("Компьютер включен.");
}
public void Off()
{
Console.WriteLine("Компьютер выключен.");
}
}
class Program
{
public static void Error()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Clear();
Console.WriteLine("Ошибка ввода! Повторите попытку!");
Console.ReadKey();
Console.Clear();
}
public static void WorkComp()
{
Console.ForegroundColor = ConsoleColor.White;
try
{
Console.Clear();
int select;
do
{
Console.WriteLine("1 вкл\n2 выкл\n3 главное меню");
select = Convert.ToInt32(Console.ReadLine());
Console.Clear();
Computer new_comp = new Computer();
if (select == 1)
new_comp.On();
else if (select == 2)
new_comp.Off();
else if (select == 3)
MainMenu();
else
{
Error();
WorkComp();
}
}
while (select != 3);
MainMenu();
}
catch (Exception)
{
Error();
WorkComp();
}
}
public static void WorkTV()
{
Console.ForegroundColor = ConsoleColor.White;
try
{
Console.Clear();
int select;
do
{
Console.WriteLine("1 вкл\n2 выкл\n3 главное меню");
select = Convert.ToInt32(Console.ReadLine());
Console.Clear();
TV new_tv = new TV();
if (select == 1)
new_tv.On();
else if (select == 2)
new_tv.Off();
else if (select == 3)
MainMenu();
else
{
Error();
WorkTV();
}
}
while (select != 3);
MainMenu();
}
catch(Exception)
{
Error();
WorkTV();
}

}
public static void MainMenu()
{
try
{
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
Console.WriteLine("1 - работа с компьютером\n2 - работа с телевизором\n3 - выход");
int select = Convert.ToInt32(Console.ReadLine());
if (select == 1)
WorkComp();
else if (select == 2)
WorkTV();
else if (select == 3)
{
return;
}
else
{
Error();
MainMenu();
}
Console.ReadLine();
}
catch(Exception)
{
Error();
MainMenu();
}
}
static void Main(string[] args)
{
MainMenu();
}
}
}

Очень Юра 04 авг 2015 20:34
Спасибо за урок.

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class SenseOrgans : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Вы чувствуете, видите и слышите окружающее пространство");
}
public void SwitchOff()
{
Console.WriteLine("Вы перестаете чувствовать, видеть и слышать окружающее пространство");
}
}
class Mind : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Вы осознали, что проснулись");
}
public void SwitchOff()
{
Console.WriteLine("Ваше сознание отключается");
}
}
class Program
{
static void Main(string[] args)
{
int key;
bool issleep = false;

List<ISwitchable> persons = new List<ISwitchable>();
persons.Add(new SenseOrgans());
persons.Add(new Mind());
Console.WriteLine("Вы хотите заснуть или проснуться?");
Console.WriteLine("---------------------------------");
Console.WriteLine("1 заснуть\n2 проснуться");
Console.WriteLine("---------------------------------");
do
{
key = Convert.ToInt32(Console.ReadLine());
if (key == 1)
{
if (issleep)
Console.WriteLine("Вы и так спите!");
else
{
foreach (ISwitchable p in persons)
p.SwitchOff();
issleep = true;
}
}
else if (key == 2)
{
if (issleep)
{
foreach (ISwitchable p in persons)
p.SwitchOn();
issleep = false;
}
else
Console.WriteLine("Вы и так бодрствуете!");
}
}
while (key > 0);
}
}

AlPer 03 июл 2015 11:05
Warguss 10 июня 2015 05:59
Интерфейсы, такая удобная штука! жаль нет уроков про делегаты и события, их так не хватает в коде!!!

Полностью поддерживаю ВАС! Уважаемый Максим Ваши уроки превосходны! Спасибо Вам за Вашу работу!!!

Юлия 23 июн 2015 05:49

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер включен");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер выключен");
}
}
class TV : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Телевизор включен");
}
public void SwitchOff()
{
Console.WriteLine("Телевизор выключен");
}
}
class Program
{
static void Main(string[] args)
{List<ISwitchable> devises=new List<ISwitchable>();
devises.Add(new TV());
devises.Add(new Computer());
foreach (ISwitchable sw in devises)
{
sw.SwitchOn();
sw.SwitchOff();
}
Console.ReadLine();
}
}
}


Flamingo 11 июн 2015 00:07
Спасибо, я немного переделал код. В итоге он стал чуть больше, но я думаю, что умение писать коротко придёт с опытом.

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class FlashLight : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Фонарик был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Фонарик не включен!");
}
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер не включен!");
}
}
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
FlashLight flashlight = new FlashLight();
Console.WriteLine("Включить компьютер(ДА, НЕТ)");
string checkString = Console.ReadLine();
if (checkString == "ДА")
computer.SwitchOn();
else if (checkString == "НЕТ")
computer.SwitchOff();
else
Console.WriteLine("Некорректно введён ответ!");
Console.WriteLine("Включить фонарик(ДА, НЕТ)");
checkString = Console.ReadLine();
if (checkString == "ДА")
flashlight.SwitchOn();
else if (checkString == "НЕТ")
flashlight.SwitchOff();
else
Console.WriteLine("Некорректно введён ответ!");
}
}

Максим 10 июн 2015 14:59
Flamingo
---
Сделайте так, чтобы в коде был всего один вызов Console.ReadLine(), перед началом всяких условий

Flamingo 10 июн 2015 13:52
Максим, в коде, который я написал почему-то работает только один метод, прописанный в интерфейсе, а другой не выполняется. Можешь посмотреть в чём проблема?

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class FlashLight : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Фонарик был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Фонарик был выключён!");
}
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер был выключён!");
}
}
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
FlashLight flashlight = new FlashLight();
Console.WriteLine("Включить компьютер(ДА, НЕТ)");
if (Console.ReadLine() == "ДА")
computer.SwitchOn();
else if (Console.ReadLine() == "НЕТ")
computer.SwitchOff();
Console.WriteLine("Включить фонарик(ДА, НЕТ)");
if (Console.ReadLine() == "ДА")
flashlight.SwitchOn();
else if (Console.ReadLine() == "НЕТ")
flashlight.SwitchOff();
}
}

Warguss 10 июн 2015 05:59
Интерфейсы, такая удобная штука! жаль нет уроков про делегаты и события, их так не хватает в коде!!!

Warguss 09 июн 2015 05:47

interface ISwitchable
{
void Connection();
void Shutdown();
}

class Lamp : ISwitchable
{
public void Connection()
{
Console.WriteLine("Светильник включен!");
}

public void Shutdown()
{
Console.WriteLine("Светильник выключен!");
}


}

class Printer : ISwitchable
{
public void Connection()
{
Console.Beep(200, 700);
Console.WriteLine("Принтер включен!");
}

public void Shutdown()
{
Console.Beep(1000, 670);
Console.WriteLine("Принтер выключен!");
}

}

class Program
{
static void Main()
{
ISwitchable lamp = new Lamp();
ISwitchable print = new Printer();

// Можно было бы реализовать совсем по другому, ну суть д/з создание и реализация интерфейсов
Console.WriteLine("Для включение светильника нажмите клавишу: *");
var button = Console.ReadLine();

if (button == "*")
{
lamp.Connection();
}

Console.WriteLine("для выключение светильника нажмите клавишу: #");
button = Console.ReadLine();

if(button == "#")
{
lamp.Shutdown();
}

Console.WriteLine("Для включение принтера нажмите клавишу: *");
button = Console.ReadLine();

if(button == "*")
{
print.Connection();
}

Console.WriteLine("для выключение принтера нажмите клавишу: #");
button = Console.ReadLine();

if(button == "#")
{
print.Shutdown();
}

Console.ReadKey();

}
}

Максим 17 май 2015 12:21
Максим
---
Да, обязательно нужен тип

Александр_Бугай 16 май 2015 20:09
namespace Example
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class Pc : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Input login");
for (string login = Convert.ToString(Console.ReadLine()); login != "admin"; login = Convert.ToString(Console.ReadLine()))
{
Console.WriteLine("Input login");
}
for (string password = Convert.ToString(Console.ReadLine()); password != "111"; password = Convert.ToString(Console.ReadLine()))
{
Console.WriteLine("Input Password");
}
Console.WriteLine("Welcome!");
}
public void SwitchOff()
{
Console.WriteLine("Thank you! Goog bye!");
}
}
class Car :ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Turn key");
}
public void SwitchOff()
{
Console.WriteLine("Pull off key");
}
}
class Program
{
static void Main(string[] args)
{
Pc myPc = new Pc();
Car myCar = new Car();
Console.WriteLine("If you want to manage pc - put 1. If you want to manage car - put any button");
int choose = Convert.ToInt32(Console.ReadLine());
if (choose == 1)
{
myPc.SwitchOn();
Console.WriteLine("Now we will finish");
myPc.SwitchOff();
}
else
{
Console.WriteLine("Are you ready to drive?");
string ready = Convert.ToString(Console.ReadLine());
if(ready== "yes")
{
myCar.SwitchOn();
Console.WriteLine("");
Console.WriteLine("Now we will finish");
myCar.SwitchOff();
}
}
Console.ReadLine();
}
}
}

Максим 15 май 2015 12:30
Без указания типа переменных в методах интерфейса почемуто выходят ошибки. Обязательно ли ставить тип переменной в методе интерфейса, при наследовании интерфейса?

interface ISwitchable
{
void MSwitchOn(int swt);
void MSwitchOff(int swt);
}

Максим 15 май 2015 12:25

namespace HomeWork
{
interface ISwitchable
{
void MSwitchOn(int swt);
void MSwitchOff(int swt);
}
class CTV : ISwitchable
{
public void MSwitchOn(int swt)
{
if (swt == 1)
{
Console.WriteLine("TV is On");
}
}
public void MSwitchOff(int swt)
{
if (swt == 2)
{
Console.WriteLine("TV is Off");
}
}
}
class CRadio : ISwitchable
{
public void MSwitchOn(int swt)
{
if (swt == 3)
{
Console.WriteLine("Radio is On");
}
}
public void MSwitchOff(int swt)
{
if (swt == 4)
{
Console.WriteLine("Radio is Off");
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("вкл/выкл ТВ клавиша \"1/2\"\nвкл/выкл Радио клавиша \"3/4\"");
int swt = Convert.ToInt32(Console.ReadLine());
List<ISwitchable> tech = new List<ISwitchable>();
tech.Add(new CTV());
tech.Add(new CRadio());
foreach(ISwitchable turn in tech)
{
turn.MSwitchOn(swt);
turn.MSwitchOff(swt);
}
Console.ReadKey();
}
}
}

phoenixpakko 28 апр 2015 11:52
Домашнее задание.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwichable // объявление интерфейса
{
void SwitchedOn();
void SwitchedOff();
}
class TV : ISwichable //реализация интерфейса
{
public void SwitchedOn()
{
Console.WriteLine("Телевизор включен (ON)");
}
public void SwitchedOff()
{
Console.WriteLine("Телевизор выключен (OFF)");
}
}
class Computer : ISwichable //реализация интерфейса
{
public void SwitchedOn()
{
Console.WriteLine("Компьютер включен (ON)");
}
public void SwitchedOff()
{
Console.WriteLine("Компьютер выключен (OFF)");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwichable> Devices = new List<ISwichable>();
Devices.Add(new TV());
Devices.Add(new Computer());
foreach (ISwichable Dev in Devices)
{
Dev.SwitchedOn();
Dev.SwitchedOff();
}
Console.ReadKey();
}
}
}


Максим 19 фев 2015 20:15
Виталий
---
Тот же пользователь Oper отлично показал для чего это нужно. Есть много приборов - телевизор, компьютер, холодильник, радио, всех их можно включить и выключить, но реализация этих методов разная(для выключения тв нажать на пульте на кнопку, или на самом тв, для компьютера alt-f4 - заверишить работу). И потом вы можете создать массив различных приборов типа ISwitchable и для каждого элемента массива (прибора) будет вызываться свой метод (с одинаковым именем) выключения. Аналогии просто достаточно абстрактные и не всё сразу понятно, но когда начнете программировать что-то полезное, не просто д/з, в некоторый момент поймете, что вам тут пригодятся интерфейсы. И эта тема близка к абстрактным классам, значит вы и их не достаточно хорошо усвоили.

Виталий 19 фев 2015 18:36
Сделал. Только вопрос: зачем нужны интерфейсы, если все равно код приходится повторять в классе-наследнике?

interface ISwitchable
{
void On();
void Off();
}
class cleaner : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
Console.WriteLine("Пылесос выключен.");
}
public void On()
{
OffOn = true;
Console.WriteLine("Пылесос включен.");
}
}
class iron : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
Console.WriteLine("Утюг выключен.");
}
public void On()
{
OffOn = true;
Console.WriteLine("Утюг включен.");
}
}
class Program
{
static void Main(string[] args)
{
iron iron = new iron();
cleaner cleaner = new cleaner();
iron.On();
cleaner.On();
Console.ReadKey();
}
}

Максим 19 фев 2015 14:59
Виталий
---
Немного не то, посмотри ниже, как сделал это задание Oper

Виталий 19 фев 2015 11:54
Вот такая вот простенькая, но правильная домашка.

interface ISwitchable
{
bool OffOn;
void Off;
void On;
}
class cleaner : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
}
public void On()
{
OffOn = true;
}
}
class iron : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
}
public void On()
{
OffOn = true;
}
}

Oper 15 фев 2015 16:20
using System;
using System.Collections.Generic;

namespace L22
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}

class Hotspot : ISwitchable
{
private string name;

public Hotspot(string name)
{
this.name = name;
}

public void SwitchOn()
{
Console.WriteLine("Hotpot {0} is ON", name);
}

public void SwitchOff()
{
Console.WriteLine("Hotspot {0} is OFF", name);
}
}

class Fan : ISwitchable
{
private byte number;
public Fan(byte number)
{
this.number = number;
}

public void SwitchOn()
{
Console.WriteLine("Fan №{0} is ON", number);
}

public void SwitchOff()
{
Console.WriteLine("Fan №{0} is OFF", number);
}
}

class Light : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Light is ON");
}

public void SwitchOff()
{
Console.WriteLine("Light is OFF");
}
}

class Program
{
static void Main(string[] args)
{
List<ISwitchable> devices = new List<ISwitchable>();
devices.Add(new Hotspot("Guest.Net"));
devices.Add(new Hotspot("VIP.Net"));
devices.Add(new Light());
devices.Add(new Fan(1));
devices.Add(new Fan(2));
devices.Add(new Fan(3));

Console.WriteLine("Начинаем конференцию, включем все устройства");
Console.WriteLine(new string('-',50));
foreach (ISwitchable dev in devices)
dev.SwitchOn();

Console.WriteLine("\nКонференция закончилась, выключаем все устройства");
Console.WriteLine(new string('-', 50));
foreach (ISwitchable dev in devices)
dev.SwitchOff();

Console.ReadKey();
}
}
}

AlexWolf 03 фев 2015 09:39

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwithable
{
void on();
void off();
}
class Magnitola : ISwithable
{
public void on()
{
Console.Clear();
Console.WriteLine("Магнитола включена.");
}
public void off()
{
Console.Clear();
Console.WriteLine("Магнитола выключена.");
}
}
class TV : ISwithable
{
public void on()
{
Console.Clear();
Console.WriteLine("Телик включен.");
}
public void off()
{
Console.Clear();
Console.WriteLine("Телик выключен.");
}
}

class Program
{
static void Main(string[] args)
{
Magnitola pioneer = new Magnitola();
TV sharp = new TV();
bool IO = true;

do
{
Console.WriteLine("Используйте кнопки Q W E R для управления.");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.Q:
pioneer.on();
break;
case ConsoleKey.W:
pioneer.off();
break;
case ConsoleKey.E:
sharp.on();
break;
case ConsoleKey.R:
sharp.off();
break;
case ConsoleKey.Escape:
IO = false;
break;
default:
Console.WriteLine("Эта кнопка не работает.");
break;
}
}
while (IO);
}
}
}


Никита 09 янв 2015 16:37
namespace bla
{
interface ISwitchable
{
void switchOn();
void switchOff();
}
class TV : ISwitchable
{
public bool Switcher { get; set; }
public string Name = "Плазма";
public void switchOn()
{
Switcher = true;
}
public void switchOff()
{
Switcher = false;
}
}
class Girl : ISwitchable
{
public bool Mouth { get; set; }
public string Name { get; set; }
public Girl(string name)
{
Name = name;
}
public void switchOn()
{
Mouth = true;
}
public void switchOff()
{
Mouth = false;
}
}
class Program
{
static void Main(string[] args)
{
Girl girl = new Girl("Катя");
TV tv = new TV();
Console.WriteLine("Сделайте выбор:\nГоловная боль - 1\nОтдых - 2");
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
girl.switchOn();
tv.switchOff();
Console.WriteLine(girl.Name+" открыла рот, "+tv.Name+" выключена");
break;
case 2:
girl.switchOff();
tv.switchOn();
Console.WriteLine(girl.Name+" закрыла рот, "+tv.Name+" включена");
break;
}
Console.ReadKey();
}
}
}

Максим 01 дек 2014 19:16
Диманиак
---
Задание простое, но зато очень хорошо показывает применение интерфейсов

Диманиак 01 дек 2014 11:42
Это задание сложно сделать по другому :)

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class BallpenParker : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Теперь можно писать ручкой");
}
public void SwitchOff()
{
Console.WriteLine("Теперь можно убрать ручку");
}
}
class DoorBell : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Динь-дилинь");
}
public void SwitchOff()
{
Console.WriteLine("[снова тишина]");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchable> things = new List<ISwitchable>();
things.Add(new BallpenParker());
things.Add(new DoorBell());
foreach (ISwitchable thing in things)
{
thing.SwitchOn();
thing.SwitchOff();
}
Console.ReadLine();
}
}
}

why_not 19 окт 2014 10:04

using System;
using System.Collections.Generic;
using System.Text;

namespace trying
{
interface ISwitchable
{
void On();
void Off();
}
class TVSet:ISwitchable
{
public void On()
{
Console.WriteLine("TVset is on");
}
public void Off()
{
Console.WriteLine("TVset is off");
}
}
class Phone:ISwitchable
{
public void On()
{
Console.WriteLine("Phone is on");
}
public void Off()
{
Console.WriteLine("Phone is off");
}
}
class Program
{

static void Main(string[] args)
{
string n;
List<ISwitchable> tech = new List<ISwitchable>();
tech.Add(new TVSet());
tech.Add(new Phone());
foreach (ISwitchable t in tech)
{
t.On();
t.Off();
}
Console.ReadKey();
}
}
}

Дмитрий 11 июн 2014 12:02
Блин, автор, как только выучу адекватно шарп и найду нормальную работу на нем - с первой зарплаты перечислю тебе на вискарь:) Очень толково и полезно!

dimasik 22 май 2014 11:45
namespace @interface
{
interface ISwitchable
{
void DeviceOn();
void DeviceOff();
}
class Washer : ISwitchable
{
public void DeviceOn()
{
Console.WriteLine("Стиральная машина включена");
}
public void DeviceOff()
{
Console.WriteLine("Стиральная машина выключена");
}
}
class Lamp : ISwitchable
{
public void DeviceOn()
{
Console.WriteLine("Лампа включена");
}
public void DeviceOff()
{
Console.WriteLine("Лампа выключена");
}
}
class Program
{
static void Main(string[] args)
{
Washer w = new Washer();
Lamp l = new Lamp();
string button = null;
Console.WriteLine("Перед тобой пульт с кнопками 1,2,3,4,exit");

while (button!="exit")
{
button = Console.ReadLine();

switch (button)
{
case "1": w.DeviceOn(); break;
case "2": w.DeviceOff(); break;
case "3": l.DeviceOn(); break;
case "4": l.DeviceOff(); break;
default: break;
}
}
Console.ReadKey();
}
}
}

Максим 12 апр 2014 21:25
GaBBo
---
Если нет необходимости их различать, просто реализуется метод и всё работает нормально. Если же нужно их отличать, тогда один метод реализуется как обычно, а другой явно:

public void foo() {
Console.WriteLine("interface1");
}
public void interface2.foo()
{
Console.WriteLine("interface2");
}

Чтобы вызвать метод второго интерфейса, необходимо объект привести к интерфейсу:
((interface2)object).foo(); // interface2

GaBBo 11 апр 2014 21:34
А что будет если в интерфейсах будут одинаковые методы?? На первый взгляд переход к интерфейсам эту проблему не решает:)

Максим 11 фев 2014 20:48
Илюфер
---
Збс

Илюфер 11 фев 2014 14:47
круто?


interface ISwitchable
{
void GetOn();

void GetOff();
}

class Lamp : ISwitchable
{
public string name = "Lamp";

public void GetOn()
{
Console.WriteLine(name + " turn on");
}

public void GetOff()
{
Console.WriteLine(name + " turn off");
}
}

class GravitationModule : ISwitchable
{
public string name = "GravitationModule";

public void GetOn()
{
Console.WriteLine(name + " turn on");
}

public void GetOff()
{
Console.WriteLine(name + " turn off");
}
}

class Action
{
public static void Main()
{
List<ISwitchable> devices = new List<ISwitchable>();
devices.Add(new Lamp());
devices.Add(new GravitationModule());

foreach (ISwitchable dev in devices)
{
dev.GetOn();
dev.GetOff();
}

Console.ReadKey();
}

}

RomanS 10 фев 2014 07:54
Спасибо. Учту.

Максим 09 фев 2014 17:39
RomanS
---
IGetPoints IShape = (IGetPoints)shape;
Console.WriteLine("This figure has {0} points", IShape.GetPoints());

Переменную можно было не создавать:

Console.WriteLine("This figure has {0} points", ((IGetPoints)shape).GetPoints());

А в целом, хороший код.

RomanS 07 фев 2014 10:42
Немного не по теме, но дайте пожалуйста общую оценку коду:
public interface IGetPoints
{
int GetPoints();
}
abstract class Shape
{
public string ShapeName { get; protected set; }
}
class Triangle : Shape, IGetPoints
{
public Triangle(string ShapeName = "Unknown triangle")
{
this.ShapeName = ShapeName;
}

public int GetPoints()
{
return 3;
}
}
class Sphere : Shape
{
public Sphere(string ShapeName = "Unknown sphere")
{
this.ShapeName = ShapeName;
}
}
public sealed class Program
{
public static void Main()
{
Shape[] MyShape = { new Triangle("My Triangle"), new Sphere() };
foreach (Shape shape in MyShape)
{
Console.WriteLine(shape.ShapeName);
if (shape is IGetPoints)
{
IGetPoints IShape = (IGetPoints)shape;
Console.WriteLine("This figure has {0} points", IShape.GetPoints());
}
else
{
Console.WriteLine("This figure has no points");
}
}
Console.ReadKey();
}
}

Максим 22 янв 2014 18:04
Ilyko
---
Это я виноват. Список должен объявляться так:
List<Iswitchable> spisok = new List<Iswitchable>();

Ilyko 22 янв 2014 18:00
Присоединяюсь к благодарностям. у меня не получается вывести список(
interface Iswitchable
{
void SwitchOn();
void SwitchOff();
}

class komnata1 : Iswitchable
{
public void SwitchOn()
{
Console.WriteLine("SwitchOn! Komnata 1");
}


public void SwitchOff()
{
Console.WriteLine("SwitchOff! Komnata 1");
}
}
class komnata2 : Iswitchable
{

public void SwitchOn()
{
Console.WriteLine("SwitchOn! Komnata 2");
}


public void SwitchOff()
{
Console.WriteLine("SwitchOff! Komnata 2");
}

}

class Program
{
static void Main(string[] args)
{
List spisok = new List(); // Вот в этой строке слово List подчеркнуто, что -то со списком не так. и выдает такую ошибку: Error 2 Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments.

spisok.Add(new komnata1());
spisok.Add(new komnata2());


foreach (Iswitchable f in spisok)
{
f.SwitchOn();
f.SwitchOff();
}

Console.ReadKey();
}
}

Максим 09 янв 2014 20:05
Дмитрий
---
Спасибо. Да, пишу на энтузиазме...)

Дмитрий 09 янв 2014 08:50
Благодаря Вашим урокам перешёл от ядрёной смеси паскаля и си на более-менее адекватный си-шарп буквально за несколько часов!
Всё предельно просто и понятно; единственный минус - уроки появляются редко, но это можно понять, делается же всё на чистом энтузиазме.
Автор, вы очень большой молодец, спасибо за то, что Вы делаете))

Максим 31 дек 2013 23:36
Андрей
---
На консолях я учу основам языка, скоро уже перейдем на второй уровень

Андрей 31 дек 2013 19:15
Твои уроки восхитительны но перешёл бы ты с консоли на WinForm было бы круто на консоли же постоянно не удобно писать.
Сделай инструкцию как ты пишешь собственную программу постепенно рассказывая как ты её пишешь чтобы мы могли в теории всё разобрать.

Максим 26 дек 2013 13:53
Илья
---
Пожалуйста)

Илья 26 дек 2013 13:34
Круто, что уроки появляются постоянно) сам на 4, мне нравится:) спасибо...)

Максим 25 дек 2013 12:47
Антон
---
Для начала нужно добить общую теорию языка. Осталось на несколько уроков. А что дальше будет нужно подумать. Возможно создам отдельный пост, где читатели оставят свои пожелания и тогда будет ясно

Антон 25 дек 2013 05:03
Ув. автор, вопрос:
Будут ли (если да - то когда) более прикладные уроки? Скажем, рассмотрение ASP .NET, создание чего нибудь полезного.

Антон 25 дек 2013 03:24
Ура, новый урок.
Спасибо огромное)


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

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus