NEDM64 Posted June 20, 2008 at 11:34 PM Report Share #192567 Posted June 20, 2008 at 11:34 PM Ora bem, estou a escrever o meu primeiro programa em C#... Então é o seguinte. No Program.cs, tenho lá um namespace com duas classes minhas. Uma usa outra, até... Quero criar uma instância da tal classe, que seja acessível a todas as janelas do programa (incluindo a principal). Onde é que eu deverei criar a tal instância? Link to comment Share on other sites More sharing options...
Triton Posted June 20, 2008 at 11:45 PM Report Share #192573 Posted June 20, 2008 at 11:45 PM Podes usar um Singleton se apenas quiseres uma instância dessa classe no programa. Aqui fica um template que faz isso mesmo: using System.Reflection; namespace Genoverse.Patterns { public class Singleton<T> where T : class { static Singleton() { } public static readonly T Instance = typeof(T).InvokeMember(typeof(T).Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, null, null, null) as T; } } Para criar uma class usando o template basta fazeres: class Exemplo : Singleton<Exemplo> { private Exemplo() { . . . } . . . } Depois para aceder a esta instância única da classe basta fazeres: Exemplo.Instance.Method(); Atenção que este template usa uma técnica chamada lazy instantiation, que significa que a instância da classe só é criada quando a acedes pela primeira vez. Não me lembro se o template é thread-safe, mas penso que sim. Outra técnica de fazer o que tu queres é usares uma propriedade ou uma variável estática ou uma lista dentro de uma classe, onde guardas as instâncias que crias. Tens várias maneiras de fazer isso. <3 life Link to comment Share on other sites More sharing options...
NEDM64 Posted June 21, 2008 at 12:18 AM Author Report Share #192581 Posted June 21, 2008 at 12:18 AM @Triton: ah? ? não percebi nada dessa cena de Singleton, mais uma "técnica" do que o método básico. Não há nenhum sítio onde possa fazer um MyClass MyInstance = new MyClass();? Link to comment Share on other sites More sharing options...
Guest id194 Posted June 21, 2008 at 02:36 AM Report Share #192608 Posted June 21, 2008 at 02:36 AM @Triton Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação). @NEDM64 Se bem percebi, tens uma classe e queres puder aceder a determinada instância dessa classe em qualquer sitio do programa correcto? Supondo que não modificaste a estrutura geral dos programas em C#, tens uma classe estática chamada Program com o método main (também estático) lá dentro, correcto? Basta fazeres: public static MyClass MyInstance = new MyClass(); Para acederes: Program.MyInstance.MetodoExemplo(); É uma forma (simples) de o fazer... Link to comment Share on other sites More sharing options...
Triton Posted June 21, 2008 at 02:44 AM Report Share #192609 Posted June 21, 2008 at 02:44 AM @Triton Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação). Agora é que vi que é o primeiro programa em C#, talvez seja uma solução um pouco mais avançada. NEDM64, qualquer dúvida apita. <3 life Link to comment Share on other sites More sharing options...
NEDM64 Posted June 21, 2008 at 03:41 AM Author Report Share #192610 Posted June 21, 2008 at 03:41 AM @Triton Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação). @NEDM64 Se bem percebi, tens uma classe e queres puder aceder a determinada instância dessa classe em qualquer sitio do programa correcto? Supondo que não modificaste a estrutura geral dos programas em C#, tens uma classe estática chamada Program com o método main (também estático) lá dentro, correcto? Basta fazeres: public static MyClass MyInstance = new MyClass(); Para acederes: Program.MyInstance.MetodoExemplo(); É uma forma (simples) de o fazer... Entao tenho assim namespace bibliotecas_jeitosas { class MyClass { // codigo }; } namepace programinha { static class Program { public static MyClass MyInstance = new MyClass(); public void Main() { // programa } } Já vi que deu! Obrigado aos dois. Infelizmente, cada vez que tenho que aceder á MyInstance, tenho de usar Program.MyInstance 😛 ... Link to comment Share on other sites More sharing options...
Guest id194 Posted June 21, 2008 at 01:34 PM Report Share #192642 Posted June 21, 2008 at 01:34 PM Mas isso é assim que funciona, acedes à classe e depois ao objecto... Qual é o mal de ter Program antes? Se não gostas do nome, cria outra classe estática com outro nome e faz a mesma coisa... Link to comment Share on other sites More sharing options...
NEDM64 Posted June 21, 2008 at 05:06 PM Author Report Share #192665 Posted June 21, 2008 at 05:06 PM Mas isso é assim que funciona, acedes à classe e depois ao objecto... Qual é o mal de ter Program antes? Se não gostas do nome, cria outra classe estática com outro nome e faz a mesma coisa... O grande mal do C#, para mim, é que é tudo . não sei quê, . não sei quê... LOL! A grande vantagem, é que não interessa a ordem pela qual as classes são escritas, por exemplo... E over-rides, etc... :smoke: Já agora, como é que acedo a um controlo, de uma janela para outra? Link to comment Share on other sites More sharing options...
Guest id194 Posted June 21, 2008 at 05:21 PM Report Share #192668 Posted June 21, 2008 at 05:21 PM O grande mal do C#, para mim, é que é tudo . não sei quê, . não sei quê... LOL! Desculpa mas este comentário é um bocadinho ridículo, mesmo que seja na brincadeira, não tem lógica nenhuma. E essa da "grande vantagem", nem se quer percebi... Acedes ao controlo da mesma maneira que acedes a outra coisa qualquer que este numa classe diferente. Uma "janela" (Form) é uma classe, logo, desde que a classe seja pública e o controlo que queres aceder também (ou então internal), basta fazeres como te disse anteriormente. Recomendo-te a estudar o básico de C# e/ou POO, porque não me parece que saibas. Link to comment Share on other sites More sharing options...
NEDM64 Posted June 21, 2008 at 07:22 PM Author Report Share #192693 Posted June 21, 2008 at 07:22 PM Desculpa mas este comentário é um bocadinho ridículo, mesmo que seja na brincadeira, não tem lógica nenhuma. E essa da "grande vantagem", nem se quer percebi... Acedes ao controlo da mesma maneira que acedes a outra coisa qualquer que este numa classe diferente. Uma "janela" (Form) é uma classe, logo, desde que a classe seja pública e o controlo que queres aceder também (ou então internal), basta fazeres como te disse anteriormente. Recomendo-te a estudar o básico de C# e/ou POO, porque não me parece que saibas. Eu sei o que estou a fazer. Antes, só tinha trabalhado em C++. Em C++, podias, dentro do programa (no caso do C#), meter logo um objecto, no C#, tens de meter uma classe, e depois meter objectos lá dentro). Não sei como é o C++ com GUI, antes, também só tinha trabalhado com a consola. Link to comment Share on other sites More sharing options...
Triton Posted June 21, 2008 at 08:07 PM Report Share #192706 Posted June 21, 2008 at 08:07 PM Eu sei o que estou a fazer. Antes, só tinha trabalhado em C++. Em C++, podias, dentro do programa (no caso do C#), meter logo um objecto, no C#, tens de meter uma classe, e depois meter objectos lá dentro). Não sei como é o C++ com GUI, antes, também só tinha trabalhado com a consola. Não percebi bem o que queres dizer com isso. Acho que queres dizer que em C++ os programas começam numa função main(), enquanto em C# o programa começa a executar num método estático Main() numa classe, mas mesmo assim não tem grande lógica criticar a linguagem por isso... <3 life Link to comment Share on other sites More sharing options...
NEDM64 Posted June 21, 2008 at 08:11 PM Author Report Share #192709 Posted June 21, 2008 at 08:11 PM Anyway, sem InteliSense, não ia a lado nenhum! ? LOL! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now