Полиморфизм с использованием интерфейса и классов - PullRequest
4 голосов
/ 21 марта 2011

Есть ли разница в полиморфизме, закодированном ниже? Есть ли разница в привязке вызовов метода?

Полиморфизм Тип 1:

class A
{
    public void method()
    {
        // do stuff
    }
}

class B extends A
{
    public void method()
    {
        // do other stuff
    }
}

Теперь я делаю вещи с помощью B, используя A

A a =  new B();
a.method();

Полиморфизм тип 2:

public interface Command
{
    public void execute();
}

public class ReadCommand implements Command
{
    public void execute()
    {
        //do reading stuff
    }
}

public class WriteCommand implements Command
{
    public void execute()
    {
        //do writing stuff
    }
}

public class CommandFactory
{
    public static Command getCommand(String s)
    {
        if(s.equals("Read"))
        {
            return new ReadCommand();
        }
        if(s.equals("Write"))
        {
            return new WriteCommand();
        }

        return null;
    }
}

Теперь я использую фабрику команд:

Command c = CommandFactory.getCommand("Read");
c.execute();

Мой вопрос: есть ли разница в двух вышеупомянутых полиморфизмах? Я знаю, что оба являются примерами полиморфизма во время выполнения, но есть ли какое-либо различие [в отношении связывания методов] или какое-либо другое различие в этом отношении?

Ответы [ 4 ]

2 голосов
/ 21 марта 2011

Полагаю, есть одно различие между

Command c = CommandFactory.getCommand("Read");

и

A a =  new B();

... в первом случае у вас есть без опции , но вы можете использовать интерфейс (или просто Object), потому что выражение в правой части оператора присваивания имеет тип Command .

Во втором случае вы сознательно выбираете , чтобы присвоить результат переменной типа A, даже если вы могли бы написать

B b = new B();

Это действительно просто разница в выборе дизайна - это не влияет на то, как на самом деле будет вести себя вызов c.execute() или a.execute().

1 голос
/ 21 марта 2011

Ваши Polymorphism Type 1 и Polymorphism Type 2 имеют одинаковый полиморфизм:)

0 голосов
/ 21 марта 2011

Нет разницы в связывании (время выполнения).Тип 1 тесно связан, тогда как тип 2 слабо связан, имеет значение при компиляции.

0 голосов
/ 21 марта 2011

Относительно поведения во время выполнения не отличается . Но

Разница в компиляции . т.е.

В 1-м типе, поскольку вы используете прямые ссылки на классы, вам необходимо, чтобы оба класса присутствовали во время компиляции.

Но со вторым типом классы требуются только во время выполнения.

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