2013-07-09 30 views
-2

假設我們有這個類Java的抽象方法提高我重寫

Animal.java

public class Animal { 

    private String name; 

    public Animal(String name) { 
     this.name = name; 
    } 

    public void shout() { 
     /* must be override */ 
    } 

    public String getName() { 
     return name; 
    } 
} 

Driver.java

import java.util.ArrayList; 
import java.util.List; 

public class Driver { 
    public static void main(String[] args) { 

    List<Animal> animals = new ArrayList<Animal>(); 
    animals.add(new Animal("Dog") { 

     @Override 
     public void shout() { 
      System.out.println(getName() + " sounds like: woof woof woof"); 
     } 
    }); 

    animals.add(new Animal("Cat") { 

     @Override 
     public void shout() { 
      System.out.println(getName() + " sounds like: meow meow meow-ow"); 
     } 
    }); 

    for(Animal a : animals) 
     a.shout(); 
    } 
} 

我怎樣才能提高我實施方法shout()或其他程序員?假設沒有理由讓動物類抽象化,併爲Dog,Cat等製作類。這擴展了動物

是否有設計模式?

+2

抱歉,作爲你的問題的立場,很難說exac真是你在問什麼。請通過編輯來澄清。 – gparyani

+0

你在濫用詞語假裝。 –

+1

@SotiriosDelimanolis現在他將「假裝」一詞換成「助推」。仍然沒有道理。 – gparyani

回答

0

嗯策略模式可以幫助你。

public class Animal { 

    private Shoutable shoutable; 
    private String name; 

    public Animal(String name) { 
     this.name = name; 
    } 

    public void shout() { 
     shoutable.shout(); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setShout(Shoutable shoutable){ 
     this.shoutable=shoutable; 
    } 
} 


public interface Shoutable{ 
    void shout(); 
} 

public class DogShout implements Shoutable{ 
    @Override 
    public void shout{ 
    System.out.println("woff gua guaa gua woff"); 
    } 
} 
+0

是否提供與動作偵聽器相同的功能?例如:\t \t JTextField jtf = new JTextField(); \t \t jtf。addActionListener方法(新的ActionListener(){ \t \t \t \t \t \t @Override \t \t \t公共無效的actionPerformed(ActionEvent的發送){ \t \t \t \t // TODO自動生成方法存根 \t \t \t \t \t \t \t} \t \t}); – oufff

+0

是的,然後你必須注入動物類(通過構造函數或setter)..並從動物類decher算法 – nachokk

+0

是的!而已!謝謝! – oufff

0

您可以在基類中實現shout()並添加返回動物聲音的方法voice()

像這樣:

public class Animal { 

private String voice; 

private String name; 

public Animal(String name, String voide) { 
    this.name = name; 
    this.voice = voice; 
} 

public void shout() { 
    System.out.println(getName() + " sounds like: "+ getVoice()); 
} 

public String getName() { 
    return name; 
} 

public String getVoice() { return voice } 
} 

在創建動物代碼:

animals.add(new Animal("Dog", "woof")); 

animals.add(new Animal("Cat", "meow"); 
0

如果你想貓與狗做動物做的事情,而不被動物抽象,就可以了。

public class Cat extends Animal 

,將工作,如果動物是抽象性或正常的,完全實現類。您將使用實現而不是擴展的接口。

0

你可以做到以下幾點:

public class Animal { 

    private String name; 
    private Shoutable shoutable; 

    public Animal(String name, Shoutable shoutable) { 
     this.name = name; 
     this.shoutable = shoutable; 
    } 

    public void shout() { 
     shoutable.shout(); 
    } 

    public String getName() { 
     return name; 
    } 
} 

的Shoutable接口:

public interface Shoutable { 
    void shout(); 
} 

而且有shoutable實現爲匿名內部類:

import java.util.ArrayList; 
import java.util.List; 

public class Driver { 
    public static void main(String[] args) { 

    List<Animal> animals = new ArrayList<Animal>(); 
    animals.add(new Animal("Dog", new Shoutable() { 
       @Override 
       public void shout() { 
        System.out.println(getName() + " sounds like: woof woof woof"); 
       } 
     }); 

    animals.add(new Animal("Cat", new Shoutable() { 

     @Override 
     public void shout() { 
      System.out.println(getName() + " sounds like: meow meow meow-ow"); 
     } 
    }); 

    for(Animal a : animals) 
     a.shout(); 
    } 
} 
+0

謝謝:)正是我在看什麼 – oufff

+0

Sababa 。考慮到每次調用「new Shoutable(){...}」時都會創建匿名內部類。如果代碼段應該進行優化(性能明智),最好爲每個類創建一個類。 –

+0

@Elad不一定。在這種情況下,匿名內部類在編譯時以'Driver $ 1'和'Driver $ 2'名稱靜態生成。無論何時達到這樣的代碼段,只創建這樣一個類的新實例。另外,如果這是Java 7,我建議你使用新的「鑽石」語法:'List animals = new ArrayList <>()'來保存輸入。 – gparyani

相關問題