实现接口
本文关键字:接口 实现 | 更新日期: 2023-09-27 18:03:37
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()函数以一种可以接受用户输入的方式实现,比如
预购后序
我该怎么做呢?
所以,让print接受一个参数,可能是一个enum:
enum PrintMethod {Inorder, Postorder};
和
string Print(PrintMethod p);
如果你不能改变接口,你可以做一些不可想象的事情,让Print从stdin中读取…*不寒而栗*
接口中的print函数是无参数的,但是它并不限制您将不在接口中的函数添加到具体类中。接口向调用者保证提供了一组指定的功能,而不是不能提供更多的功能。
如果不让用户明确了解您的类,您就无法使用该接口实现这一点。IBSTNode
没有提供带有参数的Print
方法,因此无法通过调用传递信息。
如果他们专门与你的类的一个实例(而不是一些IBSTNode
的实例)一起工作,你可以定义一个额外的方法,它接受这些额外的参数(但是你仍然需要实现无参数的Print()
方法,由于接口)。
如果绝对有必要,你也可以破解它,并在某处定义一个静态变量(在你自己的类中,或者在一些新的PrintOptions
类中),他们可以在调用Print()
之前设置这个变量,然后你的方法可以读取这个变量并相应地采取行动。然而,这个选项应该被认为是绝对的最后手段。
当然,这是假设Print
应该首先进行遍历—也就是说,在节点上调用Print
也将打印出子节点。一个更好的选择是将遍历移出IBSTNode,并且只让Print
打印单个节点—这完全有可能确实是Print
应该如何工作的。
由于您可以完全访问IBSTNode的内部结构,因此您可以编写任何类型的遍历(假设尚未定义),如果Print
不应该只打印单个节点的值,那么您甚至可以自己打印Value
,作为遍历的一部分。
您可以使用扩展方法扩展接口。
如果可以实现打印方法作为一个助手方法,通过IBSTNode
实例的接口操作,那么你可以添加额外的打印方法作为扩展方法。
这意味着当作为IBSTNode
引用时,可以直接在节点对象上调用方法,而不是强制您强制转换为定义了重载的具体类型。
public static class IBSTNodeExtensions
{
public static string PrintPreOrder(this IBSTNode node)
{
...
}
public static string PrintPreOrder(this IBSTNode node)
{
...
}
}
上面我已经展示了两个扩展方法,但是您可以使用一个带参数的扩展方法。