C #: Как я могу поделиться экземпляром класса между классами? - PullRequest
0 голосов
/ 10 февраля 2019

В моем приложении Windows есть несколько экземпляров форм, которые я создаю при загрузке основной формы (включая экземпляр самой главной формы).Я хотел бы, чтобы они были разделены между классами, чтобы я мог использовать их из любого места.Мне также нужно использовать членов каждого класса в этих случаях.

Обратите внимание, что я очень смущен тем, как это работает.Я не знаю, как я должен объявлять экземпляры своих форм, но мне нужен только один экземпляр каждой, чтобы я мог использовать метод .Hide (), а также использовать членов / классов каждой формы.

I 'Я пытался сделать экземпляры как свойства, но я не уверен, что делать дальше.Я не уверен, что это правильно.

    // get and set for form instances
    public Menu menu { get; set; }
    public RandomFacts randomFacts { get; set; }
    public QuizMenu qm { get; set; }
    public AskHowManyQuestions ahmq { get; set; }

    // in the main form load method
    menu = new Menu();
    randomFacts = new RandomFacts();
    qm = new QuizMenu();
    ahmq = new AskHowManyQuestions();

Этот код находится в одной и той же «главной» форме.

Я надеюсь, что вы можете помочь мне получить доступ к этим экземплярам.глобально и помогите мне решить эту проблему.Спасибо, что прочитали о моей проблеме.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Просто присвойте их свойствам на ваших формах

// in the main form load method

// Class which holds all of the state shared by these forms
sharedState = new SharedState();

menu = new Menu() { SharedState = sharedState };
randomFacts = new RandomFacts() { SharedState = sharedState };
ahmq = new AskHowManyQuestions() { SharedState = sharedState };
qm = new QuizMenu() { SharedState = sharedState };

Очевидно, ваши формы должны объявить свойство SharedState:

public SharedState SharedState { get; set; }
0 голосов
/ 10 февраля 2019

Мне нужен только один экземпляр каждого

Переместите ваши объявления в их собственный класс и реализуйте шаблон Singleton.Поскольку вы имеете дело с формами, вы можете создавать их экземпляры по требованию и устанавливать их обратно в ноль, когда они закрываются, подписавшись на их событие FormClosed.

Пример использования:

MyForms.menu.Show();

Код:

class MyForms
{

    private static Menu _menu = null;
    public static Menu menu {
        get {
            if (_menu == null || _menu.IsDisposed)
            {
                _menu = new Menu();
                _menu.FormClosed += (sender, e) => { _menu = null; };
            }
            return _menu;
        }
    }

    private static RandomFacts _randomFacts = null;
    public static Menu randomFacts
    {
        get
        {
            if (_randomFacts == null || _randomFacts.IsDisposed)
            {
                _randomFacts = new RandomFacts();
                _randomFacts.FormClosed += (sender, e) => { _randomFacts = null; };
            }
            return _menu;
        }
    }

    private static QuizMenu _qm = null;
    public static QuizMenu qm
    {
        get
        {
            if (_qm == null || _qm.IsDisposed)
            {
                _qm = new QuizMenu();
                _qm.FormClosed += (sender, e) => { _qm = null; };
            }
            return _qm;
        }
    }

    private static AskHowManyQuestions _ahmq = null;
    public static AskHowManyQuestions ahmq
    {
        get
        {
            if (_ahmq == null || _ahmq.IsDisposed)
            {
                _ahmq = new AskHowManyQuestions();
                _ahmq.FormClosed += (sender, e) => { _ahmq = null; };
            }
            return _ahmq;
        }
    }

}
0 голосов
/ 10 февраля 2019

Тривиальный пример:

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

public class Program
{

    public static void Main()
    {   

        var NewClassInstance = Singleton.GetSingleton().NewClassInstance;
        Singleton.GetSingleton().NewClassInstance.Method();
        var OtherClassInstance = Singleton.GetSingleton().OtherClassInstance;
        var Proparty  = OtherClassInstance.Name;
    }
}



public class Singleton
{
    public NewClass NewClassInstance {get; private set;}
    public OtherClass OtherClassInstance {get; private set;}


    private static readonly NewClass _newClass = new NewClass();
    private static readonly OtherClass _otherClass = new OtherClass();
    private static readonly Singleton _singleton = new Singleton();
    private Singleton()
    {
        NewClassInstance = _newClass;
        OtherClassInstance = _otherClass;
        // Prevent outside instantiation
    }

    public static Singleton GetSingleton()
    {
        return _singleton;
    }
}

public class NewClass
{
    public NewClass()
    {
    }

    public void Method()
    {
    }
}


public class OtherClass
{
    public string Name {get; set;}

    public OtherClass()
    {
    }
}

Вы можете получить доступ к этому экземпляру, выполнив

Singleton.GetSingleton();

Позвольте оставить вам другой пример https://dotnetfiddle.net/C1PB05

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...