Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Методы интерфейса как static


Автор: StepS 25.10.2005, 15:33
есть интерфейс IMyInterface нужно написать класс у которого методы этого интерфейса являются статическими. типа такого:
Код

interface IMyInterface{
  void PrintHello();
}

class MyClass:IMyInterface{
  public static void PrintHello(){
    Console.WriteLine("Hello world");
  }
}


но так нельзя ! я не могу понять почему (сам новичок в С#) ? Объясните плз. почему так нельзя и как нужно правильно !

Автор: Void 25.10.2005, 15:50
А в чем смысл такого объявления? Интерфейсы предназначены для того, чтобы работать с объектами полиморфно.
Цитата(StepS @ 25.10.2005, 17:33)
Объясните плз. почему так нельзя и как нужно правильно !

А из-за чего возникла такая необходимость?

Автор: Exception 25.10.2005, 18:00
вместо интерфейса юзай абстракт. класс

Автор: StepS 26.10.2005, 10:45
спасибо Run-time error. Об обстрактных я как-то забыл smile
Необходимость возникла из-за того что у нескольких классов есть одинаковый интерфейс, а статик нужно для работы с singleton-ом

Автор: Hidrag 26.10.2005, 12:16
.... а статик нужно для работы с singleton-ом

а это что такое?

Автор: stab 26.10.2005, 14:43
Цитата(Run @ 25.10.2005, 22:00)
вместо интерфейса юзай абстракт. класс


Дык, статические члены всеравно абстрактными быть не могут. ИМХО, придется создавать объекты, т.к. статически полиморфность не реализовать.

Автор: arilou 27.10.2005, 15:47
Цитата(StepS @ 26.10.2005, 10:45)
Необходимость возникла из-за того что у нескольких классов есть одинаковый интерфейс, а статик нужно для работы с singleton-ом

А для чего тебе интерфейс "для работы с синглтоном". Поясни пожалуйста. У меня очень сильное подозрение, что все что тебе надо делается без интерфейсов.

Автор: Domestic Cat 28.10.2005, 08:23
Не понял, где в приведенном коде синглтон. Помнится, статиком должен быть только один метод, который оверрайдить нет смысла.

Автор: mr.DUDA 28.10.2005, 14:24
Цитата(Domestic @ 28.10.2005, 08:23)
Не понял, где в приведенном коде синглтон

В его коде этого нету.

Решение может быть найдено следующим способом. Если нужно, чтобы все классы, реализующие интерфейс, являлись синглтонами, можно завести в интерфейсе метод или свойство, возвращающий ссылку на единственный объект этого типа:
Код
interface ISingleton
{
    ISingleton Instance {get;}
}

class MyClass : ISingleton
{
    // реализация интерфейса ISingleton
    public ISingleton Instance
    {
        get
        {
            if(_instance == null)
                _instance = new MyClass();
            return _instance;
        }
    }

    static MyClass _instance;

    // прячем конструктор, чтобы объект нельзя было создать явно
    internal MyClass() {}
}

Автор: Exception 28.10.2005, 16:45
.. как и сделано в самом дотнете

Автор: mr.DUDA 29.10.2005, 11:14
Цитата(Run @ 28.10.2005, 16:45)
.. как и сделано в самом дотнете

Пример ?

Автор: Exception 29.10.2005, 14:23
Код

System.Reflection.Missing.Value 'Свойство указывает на единственный экземпляр

Автор: mr.DUDA 30.10.2005, 09:21
Ну, это не совсем то smile

Missing.Value, DBNull.Value, float.Epsilon, int.MinValue и пр. - это как бы служебные константы, предназначенные для операций сравнения и ни для чего более; кроме того, в рамках одного класса их может быть несколько (int.MaxValue). Класс-синглтон говорит окружающему миру: есть только 1 экземпляр объекта, и предоставляет доступ к этому экземпляру через (обычно) статическое свойство или метод.

Автор: Exception 30.10.2005, 10:35
ну да.
но помню - был такой, а кто именно не помню..

Автор: arilou 31.10.2005, 12:35
Цитата(mr @ 28.10.2005, 14:24)
можно завести в интерфейсе метод или свойство, возвращающий ссылку на единственный объект этого типа

А смысл? Ведь все равно к св-ву Instance без создания объекта не обратишься. Мое имхо, через интерфейсы это нереализуемо.

Можно сделать на шаблонах (.NET 2.0), что-то вроде

Код

public class Singleton<T> where T: new
{
  private static T _inst = null;
  public static T Instance
  {
    get 
    { 
        if(_inst == null)
          _inst = new T();

        return _inst;
  }
}


Ну и юзаем так:

Код

public MySingletonClass : Singleton<MySingletonClass>
{
   public void Foo()
   {
   }
}

MySingletonClass.Instance.Foo();


Недостаток этого подхода в том, что нельзя у класса T (MySingletonClass в примере) объявить не-public конструктор, иначе where T: new не будет работать.

А вообще - зачем все это? smile

Автор: Мурлыкатам_ 21.11.2008, 16:53
Типа паттерн проектирования smile

Автор: Partizan 21.11.2008, 17:19
Мурлыкатам_, некрофилия - не хорошо  smile 

Автор: QryStaL 21.11.2008, 17:30
 smile это он 200 постов хотел набрать

Автор: Partizan 21.11.2008, 17:33
QryStaL, ну давайте я захочу 2000 набрать и щас ещё 500 топиков из бездны подниму  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)