2011-12-24 6 views
0

Пожалуйста, помогите мне решить следующую задачу: Прежде всего, у меня есть один классВызов сравнения Метод другого класса

namespace ProbA 
{ 

    public class A : IComparer 
    { 
     Private int a; 
     public int IComparer.Compare(object CurrentNode, object DataNode) 
     { 
      WBPMember Current = (WBPMember)CurrentNode; 
      WBPMember Data = (WBPMember)DataNode; 
      return Current.a- Data.a; 
     } 
    } 
} 



namespace BST 
{ 

public class BinarySearchTree<T> : ICollection<T>, IEnumerable<T> 
    { 
public virtual void Add(T data) 
     { 
      // create a new Node instance 
      BinaryTreeNode<T> n = new BinaryTreeNode<T>(data); 
      int result; 

      BinaryTreeNode<T> current = root, parent = null; 
      while (current != null) 
      { 
     result = /**** I need to call the Class A compare method.  
    } 
} 
    } 
} 

Я хочу, чтобы выполнить ClassA Сравните метод, когда следующий оператор выполнить в сборке ProBa.

A objA = new A(); 
BinarySearchTree<A> bst = new BinarySearchTree<A>(); 
Bst.Add(objA); 

Проблема заключается в том, что оба класса находятся в разных библиотеках. И BinarySearchTree - это общий класс. Итак, как я могу сравнить типизированный объект в функции добавления функции класса BinarySearchTree.


Я обновляю этот пост для уточнения. Позвольте мне более подробно описать мою проблему. У меня есть несколько бизнес-правил. И в соответствии с различными бизнес-правилами мне нужно построить другой тип BST. Offcouse, BST генерируется по той же логике, но по разной логике сравнения.

Скажем, у меня есть сборка BusineesRules. И он содержит 4 вида правил, таких как Business1, Business2, Business3. Бизнес4. И у меня есть сборка для генерации BST и других методов обхода. Этот BST является полностью общим и в сборе BST Теперь, когда мне нужно реализовать метод сравнения в каждом классе. Как ,.

Public Class Business1: IComparer 
{ 
    // Implemetation of Icompare. 
} 

То же самое для всех других классов.

Когда я пытаюсь добавить экземпляр Business1 в BST, сделайте сравнение, основанное на его собственной реализации, и то же самое для других классов.

Код для BST приводится ниже:

public class BinarySearchTree<T> : ICollection<T>, IEnumerable<T> 
    { 
     #region "Private Member Variables" 
     private BinaryTreeNode<T> root = null; 
     private int count = 0; 
     private IComparer<T> comparer = Comparer<T>.Default; // used to compare node values when percolating down the tree 
     #endregion 

     #region Constructors 
     public BinarySearchTree() { } 
     public BinarySearchTree(IComparer<T> comparer) 
     { 
      this.comparer = comparer; 
     } 
     #endregion 

public virtual void Add(T data) 
     { 
      // create a new Node instance 
      BinaryTreeNode<T> n = new BinaryTreeNode<T>(data); 
      int result; 

      // now, insert n into the tree 
      // trace down the tree until we hit a NULL 
      BinaryTreeNode<T> current = root, parent = null; 
      while (current != null) 
      { 
       result = comparer.Compare(current.Value, data);     
       if (result == 0) 
        // they are equal - attempting to enter a duplicate - do nothing 
        return; 
       else if (result > 0) 
       { 
        // current.Value > data, must add n to current's left subtree 
        parent = current; 
        current = current.Left; 
       } 
       else if (result < 0) 
       { 
        // current.Value < data, must add n to current's right subtree 
        parent = current; 
        current = current.Right; 
       } 
      } 

      // We're ready to add the node! 
      count++; 
      if (parent == null) 
       // the tree was empty, make n the root 
       root = n; 
      else 
      { 
       result = comparer.Compare(parent.Value, data); 
       if (result > 0) 
        // parent.Value > data, therefore n must be added to the left subtree 
        parent.Left = n; 
       else 
        // parent.Value < data, therefore n must be added to the right subtree 
        parent.Right = n; 
      } 
     } 
     #endregion 

* * Добавить Generic метода компаратора. Этот класс добавляется в сборку бизнес-классов.

class BusinessRules: IComparer 
    { 

     public int Compare(object CurrentHNode, object DataNode) 
     { 
      TreeMember Current; 
      TreeMember Data; 

      if (CurrentHNode is Current) 
      { 
       Current = (TreeMember)CurrentHNode; 
      } 
      else 
       throw new ArgumentException("Object is not type of WBPMember"); 

      if (DataNode is Data) 
      { 
       Data = (TreeMember)DataNode; 
      } 
      else 
       throw new ArgumentException("Object is not type of WBPMember"); 

      return Current.TreeIndex - Data.TreeIndex; 
     } 
    } 

Вы можете увидеть следующую строку кода. "result = comparer.Compare (current.Value, data);" Но это сравнение класса binarysearch. Поэтому я могу назвать метод сравнения business1 или business2.? Является ли эта сравнительная реализация полезной для сравнения объектов в методе BinarySearchTree.Add()? Еще одна важная вещь: BST и другие классы businessrule - это разные сборки.

+1

Что такое ваш вопрос? Где у вас возникают трудности? – Oded

+0

Проблема заключается в том, что оба класса находятся в разных библиотеках. И BinarySearchTree - это общий класс. Итак, как я могу сравнить типизированный объект в функции добавления функции класса BinarySearchTree. –

+0

Пожалуйста, _edit_ свой вопрос и добавьте к нему вопрос, а не комментарий. – Oded

ответ

2

Ну, если вы хотите позвонить Compare, ваш класс BinarySearchTree должен будет иметь ссылку на экземпляр компаратора. Предполагая, что вы хотите, чтобы двоичное дерево поиска было согласованным, логично использовать один и тот же сопоставитель для всех операций, действующих на один экземпляр дерева поиска. Я хотел бы предложить, что:

  • Вы можете изменить свой A класс для реализации IComparer<WBPMember> вместо того, чтобы просто IComparer
  • Вы создаете конструктор в BinarySearchTree который принимает IComparer<T> и запоминает его для последующего использования.
  • Вы, возможно создать конструктор без параметров в BinarySearchTree, используя компаратор по умолчанию для T

Что-то вроде этого:

public class BinarySearchTree<T> : ICollection<T>, IEnumerable<T> 
{ 
    private readonly IComparer<T> comparer; 

    public BinarySearchTree(IComparer<T> comparer) 
    { 
     // TODO: Work out how to handle comparer == null (could throw an 
     // exception, could use the default comparer). 
     this.comparer = comparer; 
    } 

    public BinarySearchTree() : this(Comparer<T>.Default) 
    { 
    } 

    // Now within Add, you can call comparer.Compare(current.Value, data) 
} 
+0

Здесь я уже внедрил ваше второе предложение. И мне нужен синтаксис. Я написал "result = current.Value.Compare (data);" но этот синтаксис не работает. здесь current.Value содержит , который является экземпляром класса A или экземпляром экземпляра класса WBPMember. –

+1

@hiren: Посмотрите на комментарий в моем примере кода. Вы хотите вызвать метод на компараторе, не так ли? Таким образом * вызов метода на компараторе *. Вызов 'current.Value.Compare' вызывает' Compare' на * значение *, а не на * comper *, не так ли? –

+0

Я был оцеплен из-за тока, и данные оба являются экземпляром . Поэтому я передал экземпляр класса A, называемый objA в bst.Add (obj). Тогда я хочу, чтобы какой-то синтаксис, который можно было бы назвать метод сравнения, который реализуется в классе А. общественного класса A: TreeMember, IComparer { общественного ИНТ IComparer.Compare (объект сиггепЬЫойе, объект DataNode) { A Ток = (A) CurrentNode; A Data = (A) DataNode; return Current.TreeIndex - Data.TreeIndex; } } –

Смежные вопросы