2017-09-21 3 views
-2

私はどちらのウィンドウ(KPIViewVASまたはKPIView)からも 'KeyHandler_F'を呼び出し、 'ToggleWindow'を使ってウィンドウ状態の変更を実行できるように、以下のコードを減らそうとしています。作品次のコードだがDRYではありません。2つのWPFウィンドウのアブストラクトを作成する

namespace KPI_Monitor_WPF.UI 
{ 

class FullScreen 
{ 
    public abstract class A<KPIViewVAS> 
    { 
     public abstract void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV); 
     protected abstract void ToggleWindow(KPIViewVAS KVV); 
    } 

    public class B : A<KPIViewVAS> 
    { 
     public override void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV) 
     { 
      if (e.Key == Key.F) 
      { 
       ToggleWindow(KVV); 
      } 
     } 
     protected override void ToggleWindow(KPIViewVAS KVV) 
     { 
      switch (KVV.WindowState) 
      { 
       case (WindowState.Maximized): 
        { 
         KVV.WindowState = WindowState.Normal; 
         KVV.WindowStyle = WindowStyle.ToolWindow; 
        } 
        break; 

       default: 
        { 
         KVV.WindowState = WindowState.Maximized; 
         KVV.WindowStyle = WindowStyle.None; 
        } 
        break; 
      } 
     } 
    } 

    public class C : A<KPIView> 
    { 
     public override void KeyHandler_F(object sender, KeyEventArgs e, KPIView KVV) 
     { 
      if (e.Key == Key.F) 
      { 
       ToggleWindow(KVV); 
      } 
     } 
     protected override void ToggleWindow(KPIView KVV) 
     { 
      switch (KVV.WindowState) 
      { 
       case (WindowState.Maximized): 
        { 
         KVV.WindowState = WindowState.Normal; 
         KVV.WindowStyle = WindowStyle.ToolWindow; 
        } 
        break; 

       default: 
        { 
         KVV.WindowState = WindowState.Maximized; 
         KVV.WindowStyle = WindowStyle.None; 
        } 
        break; 
      } 
     } 
    } 

} 
} 

は私が抽象クラスの下にある「ToggleWindow」のコマンドを移動したら、私はエラーが「KVV.WindowState」を述べましたが、以下の例でのコードをことができませんでし減少開始しました発見さ:

class FullScreen 
{ 
    public abstract class A<KPIViewVAS> 
    { 
     public virtual void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV) { 
      if (e.Key == Key.F) 
      { 
       ToggleWindow(KVV); 
      } 
     } 
     public virtual void ToggleWindow(KPIViewVAS KVV) 
     { 
      switch (KVV.WindowState) 
      { 
       case (WindowState.Maximized): 
        { 
         KVV.WindowState = WindowState.Normal; 
         KVV.WindowStyle = WindowStyle.ToolWindow; 
        } 
        break; 

       default: 
        { 
         KVV.WindowState = WindowState.Maximized; 
         KVV.WindowStyle = WindowStyle.None; 
        } 
        break; 
      } 
     } 
    } 
    } 

    public class B : A<KPIViewVAS> 
    { 
     public override void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV) 
     { 

     } 
     public override void ToggleWindow(KPIViewVAS KVV) 
     { 
     } 
    } 

    public class C : A<KPIView> 
    { 
     public override void KeyHandler_F(object sender, KeyEventArgs e, KPIView KVV) 
     { 
     } 
     protected override void ToggleWindow(KPIView KVV) 
     { 
     } 
    } 

} 

WindowsのKPIViewVAS 'と 'KPIView' 動的なコードがエラーなしで減少した使用のピーターDuniho提案を使用して

public partial class KPIViewVAS : Window 
{ 

    public KPIViewVAS() 
    { 
     InitializeComponent(); 
    } 

    private void KeyHandler_F(object sender, KeyEventArgs e) 
    { 
     FullScreen.B switchScreen = new FullScreen.B(); 
     switchScreen.KeyHandler_F(sender, e, this); 
    } 
} 

public partial class KPIView : Window 
{ 

    public KPIView() 
    { 
     InitializeComponent(); 
    } 

    private void KeyHandler_F(object sender, KeyEventArgs e) 
    { 
     FullScreen.A switchScreen = new FullScreen.A(); 
     switchScreen.KeyHandler_F(sender, e, this); 
    } 
} 
+0

基本的な問題は、コンパイラがKPIViewVAS' 'についての情報を持っていないということです。あなたの2番目の例では、これは型ではありません。それは型_parameter_であり、_any_型で汎用型 'A 'を使用するコードに置き換えることができます。残念ながら、使用しているタイプがどのようなものか、またはジェネリッククラスがどのように見えるかを理解するのに十分な[mcve]や十分な他のコンテキストを提供することはありませんでした。コンパイラが必要とする情報を提供するために制約内で使うことのできる基底型があるかもしれませんし、 'dynamic'を使う必要があるかもしれません。 –

答えて

0

下回っています。任意のウィンドウが

private void KeyHandler_F(object sender, KeyEventArgs e) 
    { 
     fullScreen.adjustScreen switchScreen = new fullScreen.adjustScreen(); 
     switchScreen.KeyHandler_F(sender, e, this); 
    } 

を経由して利用コードを作ることができますし、クラスがに減少した。

public class fullScreen 
{ 
public class adjustScreen 
    { 
     public void KeyHandler_F(object sender, KeyEventArgs e, dynamic KVV) 
     { 
      if (e.Key == Key.F) 
      { 
       ToggleWindow(KVV); 
      } 
     } 
     private void ToggleWindow(dynamic KVV) 
     { 
      switch (KVV.WindowState) 
      { 
       case (WindowState.Maximized): 
        { 
         KVV.WindowState = WindowState.Normal; 
         KVV.WindowStyle = WindowStyle.ToolWindow; 
        } 
        break; 

       default: 
        { 
         KVV.WindowState = WindowState.Maximized; 
         KVV.WindowStyle = WindowStyle.None; 
        } 
        break; 
      } 
     } 
    } 
} 
関連する問題