реализация интерфейса - PullRequest
0 голосов
/ 25 июля 2011
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 ]

1 голос
/ 25 июля 2011

так, пусть print принимает параметр, возможно, enum:

enum PrintMethod {Inorder, Postorder};

и

string Print(PrintMethod p);

Если вы не можете изменить интерфейс, вы можете сделать немыслимое и иметь Printчитать со стандартного ... * дрожь *

0 голосов
/ 25 июля 2011

Вы можете расширить интерфейс с помощью методов расширения.

Если возможно реализовать методы печати как вспомогательный метод, который работает с экземпляром IBSTNode через его интерфейс, тогдаВы можете добавить дополнительные методы печати в качестве методов расширения.

Это означает, что методы могут быть вызваны непосредственно на объекте узла при ссылке как IBSTNode, вместо того, чтобы принудительно приводить вас к конкретному типу с определенными перегрузками.

public static class IBSTNodeExtensions
{
    public static string PrintPreOrder(this IBSTNode node)
    {
        ...
    }

    public static string PrintPreOrder(this IBSTNode node)
    {
        ...
    }
}

Выше я показал два метода расширения, но у вас может быть один, который принимает параметр.

0 голосов
/ 25 июля 2011

Не имея конкретного пользователя, который знает о вашем классе, вы не сможете сделать это с этим интерфейсом.IBSTNode не предоставляет метод Print с аргументами, поэтому нет способа передать информацию через вызов.

Если они специально работают с экземпляром вашего класса (в отличие от простоэкземпляр некоторого IBSTNode), вы можете определить дополнительный метод, который принимает эти дополнительные аргументы (но вам все равно необходимо реализовать метод Print() без параметров из-за интерфейса).

Если абсолютноПри необходимости вы также можете взломать ее и определить где-нибудь статическую переменную (либо в своем собственном классе, либо, возможно, в каком-то новом PrintOptions классе), которую они могут установить перед вызовом Print() - ваш метод может затем прочитать эту переменную и действовать соответственно,Однако эту опцию следует считать абсолютным последним средством.

Конечно, это предполагает, что Print должен в первую очередь выполнять обход, то есть вызывать Print на узле.распечатайте детей также.Гораздо лучшим выбором было бы перенести обход из IBSTNode и только Print распечатать отдельный узел - и вполне вероятно, что именно так и должно работать Print.

Так как у вас есть полный доступ к внутренним частям IBSTNode, вы можете написать любой вид обхода, который пожелаете (при условии, что он еще не определен), и если Print не должен просто печатать значение отдельного узла,вы даже можете напечатать Value самостоятельно как часть этого обхода.

0 голосов
/ 25 июля 2011

Функция печати в интерфейсе не имеет параметров, однако она не ограничивает вас от добавления функций, которых нет в интерфейсе, к конкретному классу.Интерфейс гарантирует вызывающей стороне, что заданный набор функций предоставляется, но не может быть больше функциональных возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...