2011-03-21 57 views
4

下面編碼的多態性是否有區別?基本上,方法調用的綁定有區別嗎?使用接口和類的多態性

多態性類型1:

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; 
    } 
} 

現在我使用命令工廠:

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

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

現在用的是

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

多態性類型2 I做的東西與乙

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

我的問題是:上述兩種多態性是否有區別。我知道這兩個都是運行時多態性的例子,但是[關於方法綁定的方面]有什麼區別,或者有什麼區別?

回答

2

我想有

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

A a = new B(); 

之間的一個區別......在第一種情況下,你有別無選擇但使用的,因爲接口(或只是Object)賦值運算符右側的表達式爲Command

在第二種情況下,你是故意選擇的結果分配給A類型的變量,即使你可能已經寫

B b = new B(); 

這真的只是在一個差異設計選擇 - 它不會影響c.execute()a.execute()的實際行爲。

+0

@Swaranga:鑑於這是與谷歌採訪有關,我認爲我最好不要評論任何進一步說實話... – 2011-03-21 12:26:41

1

Polymorphism Type 1Polymorphism Type 2是一樣的多態性:)

0

對於運行行爲有沒有什麼不同。但是

區別在於彙編。即

在1st Type中,當您使用直接類引用時,需要兩個類都在編譯時出現。

但是對於第二種類型的類只在運行時才需要。

+0

不,第二種類型的'CommandFactory'在編譯時需要'ReadCommand'和'WriteCommand',並且最終在運行時需要。 – jmg 2011-03-21 11:02:49

+0

如果您已經分別編譯了CommandFactory並將其添加到jar中,該代碼在其類路徑中具有該jar,那麼在編譯時不需要它。 – GuruKulki 2011-03-21 11:11:50

0

綁定(運行時)沒有區別。類型1是緊密耦合的,而類型2是鬆散耦合的,在編譯時有所不同。