C # - реализация интерфейса - PullRequest
0 голосов
/ 03 октября 2011

У меня есть задание, в котором мне нужно реализовать интерфейс (IOrder) в моем классе полиномов.Цель IOrder - сравнить передний узел многочлена с другим многочленом и вернуть логическое значение, если один <<к другому.</p>

Вот инициализация интерфейса IOrder:

 //Definition for IOrder Interface
        public interface IOrder
        {
            // Declare an interface that takes in an object and returns a boolean value
            // This method will be used to compare two objects and determine if the degree (exponent) of one is <= to the other.
            bool Order(Object obj);

        }

Вот основы моего класса полиномов:

        //Definition for Polynomial Class
        public class Polynomial : IOrder
        {
            //this class will be used to create a Polynomial, using the Term and Node objects defined previously within this application
            //////////////////////////////////
            //Class Data Members/
            //////////////////////////////////
            private Node<Term> front;  //this object will be used to represent the front of the Polynomial(Linked List of Terms/Mononomials) - (used later in the application)

            //////////////////////////////////
            //Implemention of the Interfaces
            //////////////////////////////////
            public bool Order(Object obj) //: IOrder where obj : Polynomial 
            {
                // I know i was so close to getting this implemented propertly
                // For some reason the application did not want me to downcast the Object into a byte

               // //This method will compare two Polynomials by their front Term Exponent
               // //It will return true if .this is less or equal to the given Polynomial's front node.
               if (this.front.Item.Exponent <= obj is byte)
               {
                   return true;
               }

            }
            //////////////////////////////////
            //Class Constructor
            //////////////////////////////////   
            public Polynomial()
            {
                //set the front Node of the Polynomial to null by default
                front = null;
            }
            //////////////////////////////////

У меня проблема среализация интерфейса Order в классе полиномов.Просто для пояснения, каждый полином имеет передний узел, а узел - это термин (двойной коэффициент, байт экспоненты), а также узел типа next, который используется при связывании терминов полинома.Затем полиномы добавляются в объект полиномов.IOrder должен использоваться для сортировки полиномов в списке в соответствии со значением экспоненты переднего термина.Я думаю, что мне нужно уменьшить значение Object obj в методе, чтобы настроить его так, чтобы я мог сравнить экспонент полинома ".this" со значением экспоненты полинома, предоставленного методу.

Любое пониманиев приведении этих значений правильно было бы здорово.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

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

Чтобы ответить на ваш конкретный вопрос, оператор is проверяет тип значения;он не выполняет кастинг.Вам нужно было бы привести его так:

if (this.front.Item.Exponent <= (byte)obj)
{
    return true;
}

Но если бы вы следовали приведенному выше совету, в вашем интерфейсе было бы определение функции, которое выглядит следующим образом:

bool Order(byte exponent);

(Обратите внимание, что я назвал его exponent. Дайте своим параметрам и переменным значимые имена, а не такие вещи, как "obj")

Затем реализуйте это так:

public bool Order(byte exponent)
{
    if (this.front.Item.Exponent <= exponent)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

0 голосов
/ 03 октября 2011

Почему бы и нет:

public bool Order(Object obj)
{
    if ( (obj is byte) && (this.front.Item.Exponent <= (byte) obj) )
    {
        return(true);
    }
    return(false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...