实现接口

本文关键字:接口 实现 | 更新日期: 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)
    {
        ...
    }
}

上面我已经展示了两个扩展方法,但是您可以使用一个带参数的扩展方法。