Глобальные объекты при использовании Mono с MonoMac

Как объявить глобальные экземпляры объектов?

При использовании С# и .NET я бы сделал что-то вроде этого:

public static program {
  public static Foo MyFoo = new Foo();

  static void main() {
    MainForm = new MainForm(MyFoo);
  }
}

однако с Mono/MonoMac основная функция вызывает NSApplication.Main и не создает никаких окон напрямую. Как мне передать экземпляр MyFoo в главное окно?

Примечание. Я стараюсь избегать каких-либо ссылок на MainClass в моих окнах/контроллерах окон, поскольку это создает тесную связь. Я хочу повторно использовать классы окон в других ситуациях, отсюда и стремление к слабой связи.

Возможно ли то, что я хочу, с MonoMac?

спасибо, Энди


person Andy    schedule 24.09.2011    source источник


Ответы (1)


Использовать одиночку? Тогда ваш код будет выглядеть так:

 public class Foo {
    public static Foo Global = new Foo ();
    public Foo () { }
    // rest of Foo logic
 }

 public class Program {
   static void Main () {
      MainForm = new MainForm (Foo.Global);
   }
 }
person poupou    schedule 25.09.2011
comment
Вы изменили версию кода для Windows, но мой вопрос касается версии MonoMac, которая, как я уже упоминал, не использует MainForm... - person Andy; 26.09.2011
comment
Я изменил единственный образец, который вы дали :), но нужно применить тот же шаблон. Используйте синглтон из (любого), где он вам нужен - он будет работать также в вашем приложении Windows (если вы хотите его изменить), чем он будет работать в вашем приложении MonoMac. Шаблоны проектирования не привязаны к набору инструментов пользовательского интерфейса ;-) - person poupou; 26.09.2011
comment
Как я уже упоминал в своем первоначальном вопросе, как передать экземпляр MyFoo в основную форму при его создании? Если вы посмотрите на код MonoMac, вы увидите, что для главного окна не вызывается конструктор! Кроме того, шаблоны проектирования, используемые Cocoa и MonoMac, НЕ совпадают с теми, которые используются в моем тривиальном образце Windows. В этом весь смысл моего вопроса. - person Andy; 19.10.2011
comment
Не могли бы вы опубликовать фактический код MonoMac, показывающий это? Я бы отметил это как правильный ответ. Спасибо. - person Andy; 19.10.2011
comment
Как я уже сказал, Шаблоны проектирования не привязаны к набору инструментов пользовательского интерфейса — каждый из них имеет собственный дизайн, но шаблоны предназначены для работы с ними. Поскольку вам нужен глобальный объект, я предложил одиночный объект. Теперь у вас есть что-то глобальное, поэтому вам не нужно передавать это какому-либо конструктору (или методу). Просто используйте его, когда и где вам это нужно, т.е. Foo.Global можно использовать внутри любого кода. например вы можете вызывать System.Text.UTF8.GetBytes(...) где угодно, не передавая везде экземпляр UTF8Encoding. - person poupou; 19.10.2011
comment
Как я уже говорил, я не хотел создавать тесную связь классов. Мне не нужны ссылки на глобальные переменные внутри кода моего окна, так как мне может понадобиться использовать эти окна в разных ситуациях. Я решил свою проблему, передав экземпляр объекта контроллеру формы. - person Andy; 23.10.2011
comment
С моей точки зрения, этот вопрос касается шаблона проектирования MonoMac MVC и того, как его использовать, а не набор инструментов пользовательского интерфейса Cocoa... - person Andy; 23.10.2011