Как Полиморфизм может заменить если еще оператор в цикле?

Вам нужно создать ссылку на .lib, а не на .dll. Путь к DLL должен быть в вашем PATH для работы или в той же папке, что и исполняемый файл.

17
задан Community 23 May 2017 в 11:47
поделиться

5 ответов

Полиморфизм обычно заменяет операторы переключения, когда каждый случай соответствует другому типу. Таким образом вместо наличия:

public class Operator
{
    string operation;

    public int Execute(int x, int y)
    {
         switch(operation)
         {
             case "Add":
                 return x + y;
             case "Subtract":
                 return x - y;
             case "Multiply":
                 return x * y;
             case "Divide":
                 return x / y;
             default:
                 throw new InvalidOperationException("Unsupported operation");
         }
    }
}

Вы имели бы:

public abstract class Operator
{
    public abstract int Execute(int x, int y);
}

public class Add : Operator
{
    public override int Execute(int x, int y)
    {
        return x + y;
    }
}

// etc

Однако для типа сравнения решения Вы, если, полиморфизм действительно не помогает.

25
ответ дан 30 November 2019 в 12:01
поделиться

Полиморфизм не действительно применим в примере, который Вы обеспечили.

Посмотрите это ТАК ответ .

3
ответ дан 30 November 2019 в 12:01
поделиться

В Smalltalk, "если" на самом деле полиморфный метод в булевской переменной. В следующем примере:

[ x>y ] whileTrue:  
  [   
    ( x<z ) ifTrue: [ x:=z ]        
  ]

Эти ifTrue:aBlock сообщение реализовано в True, поскольку "выполняют этот блок" и в False, поскольку "игнорируют этот блок", таким образом, в зависимости от того, к чему эти (x<z) оценивает, любую реализацию назовут.

Так в полиморфизме Smalltalk заменяет каждый если еще конструкция по умолчанию :)

3
ответ дан 30 November 2019 в 12:01
поделиться

Полиморфизм может только заменить, если тесты, когда, если тест в основном dispatchi g ко множеству методов в зависимости от "типа" объекта. Например, если объект является типом X, вызывают нечто, если это - Y, вызывают панель и так. В этом изобретенном примере можно было бы определить интерфейс DoSonething с методом плохо (). Оба X и Y реализовали бы Baz и имели бы их соответствующий baz (), вызывают нечто () для X и панель () для Y. Это просто звонящее baz () избавило бы от необходимости если тест.

3
ответ дан 30 November 2019 в 12:01
поделиться

Один шаблон должен иметь объекты, которые представляют результат теста и объекты, которые представляют блок для выполнения. Объекты результата переопределили функции выбора, поэтому если Bool имел выбирание (T положительный, T отрицательный) затем Bool. TRUE возвратил бы положительный аргумент и Bool. ЛОЖЬ возвратила бы отрицание. Наивные реализации языков smalltalk-семейства работают как этот.

Для кодирования цикла с условием продолжения в той форме, там должен назвать выбрать метод на результате сравнения X и Y, чтобы определить, назвать ли блок для внутренней части цикла с условием продолжения, и тот блок также использует, выдерживают сравнение и принимают решение установить значение x. Более буквальный перевод должен был бы выбрать или блок, который устанавливает x на z или тот, который ничего не делает; вместо этого это просто использует, принимают решение задержать x к тому же значению.

, Очевидно, это - излишество и неэффективный для этого простого случая.

public class WantonPolymorphism {

    static class Int32 {
        final int value;
        Int32 ( final int value ) { this.value = value; }

        Compare compare ( Int32 other ) {
            // Java runs out of turtles at this point unless you use
            // an enum for every value
            if ( this.value < other.value ) return Compare.LESS;
            if ( this.value > other.value ) return Compare.GREATER;
            return Compare.EQUAL;
        }
    }

    enum Compare {
        LESS {
            <T> T choose (T less, T equal, T greater) { return less; }
        },
        EQUAL {
            <T> T choose (T less, T equal, T greater) { return equal; }
        },
        GREATER {
            <T> T choose (T less, T equal, T greater) { return greater; }
        };

        abstract <T> T choose (T less, T equal, T greater) ;
    }

    interface Block { Block execute () ; }


    /**
     * Main entry point for application.
     * @param args The command line arguments.
     */
    public static void main (String...args) {
        Block block =  new Block() {
            Int32 x = new Int32(4);
            Int32 y = new Int32(3);
            Int32 z = new Int32(2);

            public Block execute () {
                System.out.printf("x = %d, y = %d, z = %d\n", x.value, y.value, z.value);

                return x.compare(y).choose(done, done, new Block () {
                    public Block execute () {
                        x = x.compare(z).choose(x,x,z);

                        return x.compare(y).choose(done, done, this);
                    }
                });
            }

            Block done = new Block () {
                public Block execute () {
                    System.out.printf("x = %d, y = %d, z = %d\n", x.value, y.value, z.value);
                    System.exit(0);
                    return this;
                }
            };
        };

        for(;;) 
            block = block.execute();
    }
}
1
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: