2017-04-04 11 views
0

私はこのコードを持っています。問題は、クラスDatabaseからクラスMainWindowにアクセスする必要があることです。私はDatabaseMainWindowから継承しようとしましたが、それは動作しませんでした。私はちょうど両方のクラスで互いにクラスの参照を持つ必要があります。 アドバイスありがとうございます!データベースのコンストラクタでのデータベースへのメインウィンドウの参照を渡すと、これを行うにはいくつかの方法があります2つのクラス間の参照

public partial class MainWindow : Window 
{ 
    Database db = new Database(@"database.txt"); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void setLabel(string s) 
    { 
     Vystup.Content = s; 
    } 
} 

class Database 
{ 
    //constructor and other methods 

    public void doSomething() 
    { 
     //Here I want to set Label in MainWindow, something like 
     //MainWindow.setLabel("hello"); 
    } 
} 
+2

MainWindowをデータベースクラス – Marusyk

+5

のコンストラクタパラメータとして渡すようにしてください**これはしません**これはSoS(分離の懸念)とカプセル化(*クラスをプライベートな状態をプライベートに保つ*)を破ります。データベースクラスは作業を行い、結果を返す必要があります。 MainWindowクラスはそれ自身のラベルを更新する必要があります。クラス間でプライベート状態を共有しないでください。 – Igor

+0

データベースに、そのコンストラクタにMainWindow型のオブジェクトを持ち、そのオブジェクトをプライベートフィールドに渡します。あなたが持っている他の引数で 'this'を渡してください。その後、データベースでアクセスできます。実際のMainWindowに縛られないように、インタフェースされたオブジェクトを使用する方がよいでしょう。 @Igorはこの場合正しいですが、これは純粋にそれを行う方法です - あなたがここにいるべきではありません... –

答えて

1

...

  • 。これは、DatabaseがMainWindowに依存しているため、これはお勧めしません。
  • MainWindowがデータベースを持つたびに、設定する必要のある値をデータベース関数に返します。
  • doSomethingが呼び出されたときに呼び出されるように、データベースコンストラクタにアクションを渡します。
  • ... ...

    コンストラクタでアクションを渡す
    public partial class MainWindow : Window { 
        Database db = new Database(@"database.txt"); 
        public void setLabel(string s) { 
         Vystup.Content = s; 
        } 
        public void SomeDatabaseThing() 
        { 
         string returnValue = db.doSomething(); 
         setLabel(returnValue); 
        } 
    } 
    
    class Database { 
        public Database(string file) { 
         ... 
        } 
        public string doSomething() { 
         return "hello"; 
        } 
    } 
    

    を設定する

    public partial class MainWindow : Window { 
        Database db = new Database(this, @"database.txt"); 
        public void setLabel(string s) { 
         Vystup.Content = s; 
        } 
    } 
    
    class Database { 
        private MainWindow _mainWindow { get; set; } 
        public Database(MainWindow window, string file) { 
         this._mainWindow = window; 
         ... 
        } 
        public void doSomething() { 
         _mainWindow.setLabel("hello"); 
        } 
    } 
    

    データベースの戻り値を参照する(推奨されません)を渡す


...

public partial class MainWindow : Window { 
    Database db = new Database(@"database.txt", setLabel); 
    public void setLabel(string s) { 
     Vystup.Content = s; 
    } 
} 

class Database { 
    private Action<string> _onDoSomething = null 
    public Database(string file, Action<string> onDoSomething) { 
     this._onDoSomething = onDoSomething; 
     ... 
    } 
    public void doSomething() { 
     onDoSomething("hello"); 
    } 
} 
関連する問題