C#でTUIライブラリを開発しています。表示オブジェクトのカラーテーマを行う方法についてアドバイスが必要です。すべてのこのインターフェイスから継承し、画面上に描画することができるオブジェクト:クラスに抽象クラスの固有の実装を含める/使用させる
public interface IDrawable
{
Area ScreenArea { get; }
List<char[]> DisplayChars { get; }
//some other properties...
}
いうかは、より具体的には、各描画可能なオブジェクトのためのインターフェースは、このインターフェース(IWindow
がIDrawable
ある)を実装します。各IDrawable
が領域構造体によって表されるコンソールウィンドウの指定された部分に描画される:
public struct Area
{
public readonly int EndX;
public readonly int EndY;
public readonly int Height;
public readonly int StartX;
public readonly int StartY;
public readonly int Width;
public Area(int startX, int endX, int startY, int endY)
{
StartX = startX;
EndX = endX;
StartY = startY;
EndY = endY;
Height = endY - startY;
Width = endX - startX;
}
/// <summary>
/// Get the overlapping area between this area and another.
/// </summary>
/// <param name="refArea"></param>
/// <returns>Overlap area relative to the upper left corner of the ref area.</returns>
public Area OverlapWith(Area refArea)
{
//....
}
}
オブジェクトの実際の描画はDisplayCharsの各要素にConsole.Write()
を呼び出す静的Display
クラスのメソッドによって処理されます。 IDrawable
から継承した各クラスは、その領域を別々の色域に分割するための独自のルールを強制的に適用することを願っています。たとえば、ポップアップウィンドウには、外枠、その外側の境界線)、およびその内側領域。
私はしばらく私の頭の中でこれをやり遂げる方法を捨ててきました。どんな文字をどの色で書き込むかのルールを入れるには、タイプをColorScheme
にする必要があります。私はこれを行う最善の方法は、色を別々に適用できる "サブ領域"のリストを含む抽象クラスにすることであると判断した。
非抽象度の各IDrawable
は、ColorScheme
から継承する独自のクラスを実装する必要があります。たとえば、抽象的Window : IWindow
クラスはそのような実装を持たないが、PopupWindow : Window
クラスは対応するタイプがPopupWindowColorScheme : ColorScheme
でなければならず、PopupWindow
の作成者はクラス 'Area
を分割する方法を定義します。各PopupWindow
には、特定の色を含むこのタイプの独自のインスタンスがあります。
これは可能ですか?そうでない場合は、IDrawable
タイプの作者に領域を着色可能な領域に分割する方法を指定させる別の方法がありますか?
これは完璧です!すばやい応答ありがとう:)私はちょうどDrawScreeneは、Drawメソッドが画面に書き込む各文字の色をチェックして設定する必要がないような方法で、ColorSchemeの外観を把握する必要があります。 – thetiniestmouse
貧弱な継承階層設計のために、わずかな問題です。私は現在、 'IDrawable'から継承した抽象クラスと、' WindowManager'や 'ControlManager'のようなクラスがそれぞれのインタフェースを介してそれぞれの型を扱うことができるというアイデアを抽象ベースで間接的に継承した特定の型を持っています。それらはdrawablesとして。キャストを使用して、新しいタイプのウィンドウを作成するときに 'IDrawable'と' IWindow'の両方を使用するなど、カスタムタイプを作成する人に頼りすぎるのでしょうか? – thetiniestmouse
@thetestestmouseその場合、 'ColorScheme'以外のすべてのコアプロパティとメソッド*を指定する非ジェネリックインターフェイス' IDrawable'と 'ColorScheme 'を提供するサブインターフェイス' IDrawable:IDrawable'を使うことをお勧めします。 '特有の機能です。ベース 'ColorScheme'を公開し、' IDrawable 'を' new T ColorScheme {get; } '。 (これは 'IEnumerable :IEnumerable'がどのように動作するかと似ています) –