public interface IBSTNode
{
IBSTNode Left { get; }
IBSTNode Right { get; }
int Value { get; }
IDictionary<string, object> DataFields { get; set; }
void Insert(IBSTNode node);
string Print(); }
这是我必须使用的界面设计。但我必须以一种可以接受用户输入的方式实现Print()函数,如
预购 后顺序
我该怎么做?
答案 0 :(得分:1)
所以,打印一个参数,也许是一个枚举:
enum PrintMethod {Inorder, Postorder};
和
string Print(PrintMethod p);
如果你不能改变界面,你可以做不可想象的事,并且从stdin中读取Print ... * shudder *
答案 1 :(得分:0)
界面中的print函数是无参数的,但是并不限制您将不在接口中的函数添加到具体类中。接口确保调用者提供了一组指定的功能,而不是没有更多的功能。
答案 2 :(得分:0)
如果用户没有明确了解您的课程,则无法使用该界面进行操作。 IBSTNode
没有提供带参数的Print
方法,因此无法通过调用传递信息。
如果他们专门使用您的类的实例(而不仅仅是某个IBSTNode
的实例),您可以定义一个额外的方法来获取这些额外的参数(但您仍然需要实现无参数Print()
方法,由于接口的原因。)
如果绝对必要,你也可以破解它并在某个地方(在你自己的类中,或者在一些新的PrintOptions
类中)定义一个静态变量,他们可以在调用Print()
之前设置它们 - 你的然后,方法可以读取此变量并相应地执行。但是,这个选项应该被认为是绝对的最后手段。
当然,假设Print
应该首先进行遍历 - 也就是说,在节点上调用Print
也会打印出子节点。一个更好的选择是将遍历移出IBSTNode,并且只有Print
打印单个节点 - 这完全可能是Print
确实应该如何工作。
由于您可以完全访问IBSTNode的内部,因此您可以编写任何类型的遍历(假设尚未定义),并且Print
不仅仅是打印值在单个节点中,您甚至可以自己打印Value
作为遍历的一部分。
答案 3 :(得分:0)
您可以使用扩展方法扩展界面。
如果可以将print方法实现为通过它的接口在IBSTNode
实例上运行的辅助方法,那么您可以添加其他打印方法作为扩展方法。
这意味着当引用为IBSTNode
时,可以直接在节点对象上调用这些方法,而不是强制转换为定义了重载的具体类型。
public static class IBSTNodeExtensions
{
public static string PrintPreOrder(this IBSTNode node)
{
...
}
public static string PrintPreOrder(this IBSTNode node)
{
...
}
}
上面我展示了两种扩展方法,但你可以使用一个参数。