我正在用 C# 开发一个 TUI 库,我需要有关如何为显示对象制作颜色主题的建议。可以在屏幕上绘制的对象都继承自这个接口:
public interface IDrawable
{
Area ScreenArea { get; }
List<char[]> DisplayChars { get; }
//some other properties...
}
或者更确切地说,每个可绘制对象的接口都实现了这个接口(IWindow
is a IDrawable
)。每个IDrawable
都绘制在由 Area 结构表示的控制台窗口的指定部分上:
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)
{
//....
}
}
对象的实际绘制由静态Display
类中的方法处理,这些方法调用Console.Write()
DisplayChars 中的每个元素。我希望每个继承自IDrawable
的类都被迫实施其自己的规则,以将其区域划分为不同的颜色区域,例如,弹出窗口可能有单独的可着色区域用于其外边框、其标题(在其内部外边界)及其内部区域。
一段时间以来,我一直在思考如何做到这一点。我需要创建一个类型 ,ColorScheme
来包含用什么颜色写什么字符的规则。我决定最好的方法是让它成为一个抽象类,其中包含一个“子区域”列表,颜色可以单独应用。
我希望每个非抽象IDrawable
都必须实现自己的继承自ColorScheme
. 例如,抽象Window : IWindow
类将没有这样的实现,但PopupWindow : Window
类必须具有相应的类型,PopupWindowColorScheme : ColorScheme
其中的作者PopupWindow
将定义如何将类拆分Area
为单独的区域。每个PopupWindow
都有自己的这种类型的实例来包含其特定的颜色。
这可能吗?如果没有,是否有另一种方法可以强制IDrawable
类型作者指定将其区域划分为可着色区域的方法?