Каково различие между Полиморфизмом и Несколькими Отправка?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

30
задан CJ Dennis 11 August 2018 в 00:06
поделиться

7 ответов

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

количество параметров, используемых языком/временем выполнения, определяет 'тип' полиморфизма, поддерживаемого языком.

Единственная отправка является типом полиморфизма, где только один параметр используется (получатель сообщения - this, или self) для определения вызова.

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

, Таким образом, можно сказать, что полиморфизм является общим термином и несколько и единственная отправка - определенные типы полиморфизма.

Приложение: Перегрузка происходит в течение времени компиляции. Это использует информацию о типе, доступную во время компиляции для определения который тип метода звонить. Единственная/несколько отправка происходит во время времени выполнения.

Пример кода:

using NUnit.Framework;

namespace SanityCheck.UnitTests.StackOverflow
{
    [TestFixture]
    public class DispatchTypes
    {
        [Test]
        public void Polymorphism()
        {
            Baz baz = new Baz();
            Foo foo = new Foo();

            // overloading - parameter type is known during compile time
            Assert.AreEqual("zap object", baz.Zap("hello"));
            Assert.AreEqual("zap foo", baz.Zap(foo));


            // virtual call - single dispatch. Baz is used.
            Zapper zapper = baz;
            Assert.AreEqual("zap object", zapper.Zap("hello"));
            Assert.AreEqual("zap foo", zapper.Zap(foo));


            // C# has doesn't support multiple dispatch so it doesn't
            // know that oFoo is actually of type Foo.
            //
            // In languages with multiple dispatch, the type of oFoo will 
            // also be used in runtime so Baz.Zap(Foo) will be called
            // instead of Baz.Zap(object)
            object oFoo = foo;
            Assert.AreEqual("zap object", zapper.Zap(oFoo));
        }

        public class Zapper
        {
            public virtual string Zap(object o) { return "generic zapper" ; }
            public virtual string Zap(Foo f) { return "generic zapper"; }
        }

        public class Baz : Zapper
        {
            public override string Zap(object o) { return "zap object"; }
            public override string Zap(Foo f) { return "zap foo"; }
        }

        public class Foo { }
    }
}
43
ответ дан jop 27 November 2019 в 23:57
поделиться

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

Несколько диспетчеризируют, позволяет выделять подтипы в полиморфизме из аргументов в пользу вызовов метода.

Единственная отправка также допускает более ограниченный вид полиморфизма (использующий то же имя метода для объектов, которые реализуют тот же интерфейс или наследовали тот же базовый класс). Это - классический пример полиморфизма, где у Вас есть методы, которые переопределяются в подклассах.

Кроме того, дженерики обеспечивают параметрический полиморфизм типа (т.е. тот же универсальный интерфейс для использования с различными типами, даже если они не связаны — как List<T>: это может быть списком любого типа и используется тот же путь независимо).

3
ответ дан andyg0808 27 November 2019 в 23:57
поделиться

Я никогда не слышал о Нескольких Отправку прежде, но после поглядывания на страницу Wikipedia она много походит на MD, тип полиморфизма, когда используется с аргументами методу.

Полиморфизм является по существу понятием, что объект может рассматриваться как любой тип, который является, это - основа. Таким образом, если Вы имеете Car и Truck, они могут оба рассматриваться как Vehicle. Это означает, что можно назвать любой Vehicle метод для любого.

Несколько подобных взглядов отправки, в котором это позволяет Вам назвать методы с аргументами нескольких типов, однако я не вижу определенных требований в описании. Во-первых, это, кажется, не требует типа общей базы (не, что я мог предположить реализовывать ЭТО без void*), и у Вас может быть несколько включенных объектов.

Так вместо того, чтобы звонить Start() метод на каждом объекте в списке (который является классическим примером полиморфизма), можно назвать StartObject(Object C) метод определенный в другом месте и кодировать его, чтобы проверить тип аргумента во время выполнения и обработать его соответственно. Различие здесь - то, что Start() метод должен быть встроен в класс, в то время как StartObject() метод может быть определен за пределами класса, таким образом, различные объекты не должны соответствовать интерфейсу.

Это могло быть хорошо, если бы Start() метод нужно было назвать с различными аргументами. Возможно Car.Start(Key carKey) по сравнению с [1 111]

, Но обоих можно было назвать как [1 112] или StartObject(theMissile)

Интересное понятие...

2
ответ дан andyg0808 27 November 2019 в 23:57
поделиться

Несколько Отправка более сродни перегрузке функции (как замечено в Java/C++), кроме вызванной функции, зависят от типа выполнения аргументов, не их статического типа.

1
ответ дан eduffy 27 November 2019 в 23:57
поделиться

если Вы хотите, чтобы концептуальный эквивалент вызова метода

(obj_1, obj_2, ..., obj_n)->method

зависел от каждого определенного типа в кортеже, то Вы хотите, несколько диспетчеризируют. Полиморфизм соответствует случаю n=1 и является необходимой функцией ООП.

1
ответ дан Purfideas 27 November 2019 в 23:57
поделиться

Несколько Отправка являются своего рода полиморфизмом. В Java/C#/C ++, существует полиморфизм посредством наследования и переопределения, но это не, несколько диспетчеризируют, который основан на двух или больше аргументах (не всего this, как в Java/C#/C ++)

1
ответ дан andyg0808 27 November 2019 в 23:57
поделиться

Несколько Отправка полагаются на базирующийся полиморфизм. Типичный полиморфизм, с которым встречаются в C++, C#, VB.NET, и т.д.... использует единственную отправку - т.е. функция, которая вызвана, только зависит от экземпляра единого класса. Несколько диспетчеризируют, полагается на несколько экземпляров класса.

0
ответ дан Kevin 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

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