-2
두 개의 창 (KPIViewVAS 또는 KPIView)에서 'KeyHandler_F'를 호출하고 'ToggleWindow'를 사용하여 창 상태의 변경 사항을 실행할 수 있도록 아래 코드를 줄이려고합니다. 작품 아래의 코드하지만 DRY되지 않습니다 :두 개의 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)
{
}
}
}
창문 '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);
}
}
기본적인 문제는 컴파일러가 KPIViewVAS''에 대한 정보가 없다는 것입니다. 귀하의 두 번째 예에서, 그것은 유형이 아닙니다. 이는 _parameter_ 유형이며 _any_ 유형에 의해 일반 유형 'A'을 사용하는 코드로 대체 될 수 있습니다. 유감스럽게도, 사용하는 유형이 어떻게 보이는지, 또는 제네릭 클래스가 어떻게 보일지 이해하기에 좋은 [mcve] 또는 다른 문맥을 제공하는 것을 귀찮게하지 않았습니다. 컴파일러가 필요로하는 정보를 제공하기 위해 제약 조건에서 사용할 수있는 기본 유형이있을 수 있습니다. 또는 '동적'을 사용해야하거나 어쩌면 일반화하지 않아도됩니다. –