2013-05-12 63 views
1

我有一個abstract class裝載機:Java抽象變量(超使用子類的字符串)

public abstract class Loader 
{ 
    private String EXTENSION = ".xxx"; 
    private String dir; 

    public abstract Object load(String file); 
    public abstract List<?> loadList(String file, int number); 

    public Loader(String dir) 
    { 
     this.dir = dir.replace("\\", "/") + "/";; 
    } 

    public String formatName(String name) 
    { 
     return dir + name + EXTENSION; 
    } 
} 

它的子類應該可以改擴建

public class MidiLoader extends Loader 
{ 
    private String EXTENSION = ".mid"; 

    public MidiLoader(String dir) 
    { 
     super(dir); 
    } 

    public MidiLoader() 
    { 
     super(Constants.SOUNDDIR); 
    } 

    @Override 
    public Sequence load(String file) 
    { 
     blah 
    } 

    public List<Sequence> loadList(String file, int number) 
    { 
     blah 
    } 

} 

擴展名「.MID」應使用由LoaderformatName功能。我怎樣才能做到這一點(沒有重複的代碼)?

謝謝。

回答

4

有一個構造

protected Loader(String dir, String ext) 

這樣的擴展是由子類確定。

爲抽象類public製作構造函數可能會令人困惑,因爲它無法公開使用。

+0

我不是這種方法的巨大粉絲,但我認爲它就足夠了。 – 2013-05-12 21:19:13

0

問題是你不能覆蓋屬性只有方法。要遵循更好的OOP模型,您應該使用封裝併爲EXTENSION提供getter和setter。把這樣的事情在你的Loader類:

private String extension = ".xxx" 

public void setExtension(String extension) { 
    this.extension = extension; 
} 

public String getExtension() { 
    return this.extension; 
} 


public String formatName(String name) { 
    return dir + name + getExtension(); 
} 

最好使用小寫名延期,除非該屬性實際上是一個常數。然後你可以添加一些構造函數給Loader。

// Previous without using an explict extension 
public Loader(String dir) { 
    ... 
} 

public Loader(String dir, String extension) 
{ 
    this(dir); // call the default constructor 
    this.extension = extension; 
} 

然後MidiLoader構造函數裏面,你可以打電話叫super(dir,extension)

或者,你可以忽略構造函數和setter和剛剛定義getExtension()在每個子類中。如果你走這條路線,最好使getExtension抽象。

所以裝載機將具有以下定義:

public abstract String getExtension();

抽象方法必須由子類實現,你不能實例化抽象類本身。這意味着MidiLoader將被迫提供一個名爲getExtension()的方法,該方法返回一個String,並且formatName將始終工作(使用我的擴充的formatName方法)。

+0

大寫字母的名字是一個常數後的剩餘字符。我試着改變一下修飾符,看看能不能改變它,但忘記改變大小寫。 – 2013-05-12 21:34:31