我正在创建一个 API,允许某人构建带有可选选项的菜单。API 库本身没有任何渲染逻辑,只有描述选项所需的信息。这样,此 API 的使用者可以将其添加为依赖项,渲染器库可以将其添加为依赖项。然后渲染器可以根据消费者创建的对象渲染菜单。
它是这样的:
public interface IOptionGroup
{
List<IOption> Options { get; }
}
public interface IOption
{
//Some Shared attributes for all Options
}
public interface IOptionCheckbox : IOption
{
// Some checkbox specific attributes
void OnValueChanged(bool newValue);
}
暴露基础接口:
拥有基本 IOption 接口很好,因为它拥有所有不同 Option 类型的所有共享属性,但只有 API 用户实现从 IOption 派生的接口才有意义。如果他们自己实现了 IOption 并将其作为选项之一传回,则将没有足够的信息来实际将有效的选项绘制到菜单中。
渲染期间向上转换:
此外,这种设计迫使我向上转换接口以确定要呈现的 Option 类型(这感觉不对)。另外,如果他们实现了多个 Option 接口呢?!?
foreach(IOption option in group.Options)
{
if (option is IOptionCheckbox)
{
// Render a Checkbox
} else if (option is ...)
{
// Render a ...
}
}
用例使其更清晰:
我希望客户端能够实现描述菜单项的接口,而无需了解有关呈现它们的任何信息。对于不同的选项,他们得到不同的回调:
示例客户端代码:
public class MyCheckBox : IOptionCheckbox
{
void OnValueChanged(bool newValue)
{
// Do something specific here when user checks/unchecks option
}
}
客户端只需担心单击复选框时要执行的操作。我不能在 IOption 接口中放置渲染器,因为这需要客户端自己实现重渲染器。
潇湘沐
相关分类