实现界面

时间:2011-07-25 01:25:36

标签: c# algorithm generics interface

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()函数,如

预购 后顺序

我该怎么做?

4 个答案:

答案 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)
    {
        ...
    }
}

上面我展示了两种扩展方法,但你可以使用一个参数。