1

別のクラスのクラス内のメソッドを使用しようとしています。

namespace Crystal.Utilities
{
   public class Logging
   {
      public static void Log()
      {
          //dostuff
          Crystal.MainForm.general_log_add_item("Hello World");
      }
   }
}

namespace Crystal
{
   public partial class MainForm : Form
   { 
      public void general_log_add_item(string msg)
      {
         listBox1.Items.Add(msg);
      }
   }
} 

どこからでもCrystal.Utilities.Logging.Log()を呼び出せるようにし、Crystal.MainForm.general_log_add_item()を呼び出せるようにしたい。しかし、それを公開すると表示されなくなり、静的であるとリストボックスと対話できないため、許可されません。

4

4 に答える 4

4

これは間違ったアプローチです。UIが変更される可能性があるため、クラスはUIを呼び出さないでください。クラスはUIを知らないか気にしないでください。代わりに、クラスは、フォームがサブスクライブできるイベントを公開し、イベントの引数に含まれる情報に基づいて更新することができます。

これは急いで一緒に投げられた例です。

class Program
{
    static void Main()
    {
        Logger.OnLogging += Logger_OnLogging;
        Logger.Log();
        Logger.OnLogging -= Logger_OnLogging;
    }

    static void Logger_OnLogging(LoggingEventArgs e)
    {
        Trace.WriteLine(e.Message);
    }
}

public class Logger
{
    public delegate void LoggingEventHandler(LoggingEventArgs e);

    public static event LoggingEventHandler OnLogging;

    public static void Log()
    {
        // do stuff
        RaiseLoggingEvent("Data logged");
    }

    protected static void RaiseLoggingEvent(string message)
    {
        if (OnLogging != null)
            OnLogging(new LoggingEventArgs(message));
    }
}

public class LoggingEventArgs : EventArgs
{
    public LoggingEventArgs(string message)
    {
        this.Message = message;
    }

    public string Message { get; private set; }
}
于 2010-09-22T21:14:25.813 に答える
3

静的メソッドとして実装するのではなく、シングルトンとして実装してみてください。インスタンスをスコープ内でグローバルにし、すべてを静的にすることなく(したがって、インスタンスとして使用できないように)1つのインスタンスに制限することは、一般的なトリックです。

于 2010-09-22T20:53:58.267 に答える
2

ウィンドウが静的ではないことを理解する必要があります。彼のインスタンスが1つあるため、メソッドを静的にできないので、Application.Windowsを使用してこのインスタンスに到達し、addメソッドを呼び出すことができます。

または、ロギングとウィンドウを仲介する別のクラスのコンストラクターにウィンドウを登録できます。

わからない場合は教えてください。もっと明確にしようと思います

于 2010-09-22T20:51:41.367 に答える
2

メソッドを「静的」として宣言すると、そのメソッドが含まれるクラスの特定のインスタンスに依存しないことを意味します。
たとえば、「chair」という名前のクラスがあり、椅子の数を数えたい場合は、静的フィールドと、そのフィールドの値を返す静的メソッドを使用してこれを行います。
すべての椅子の数は、特定の椅子とは関係ありません。
あなたの場合、フォームの特定のインスタンスにアイテムを追加する静的メソッドを追加したいとします。それは不可能であり、意味がありません。
アイテムをlistBoxに追加する場合は、パブリックメソッドを使用する必要があります。
つまり、基本的に私が言っているのは、あなたがやろうとしていることを考え直してください。なぜそれがうまくいかないのかについての良い説明があります。

于 2010-09-22T21:04:59.117 に答える