2013-07-19 57 views
2

我有一個抽象超類和它的很多子類。每個子類都有多個實例。超類中的靜態變量用於控制多個子類

每個子類都需要使用從tar.gz壓縮包中解壓縮的一些文件。每個子類都有自己獨立的tar.gz.即使我有一個子類的多個實例,我只需要爲所有子類的實例解壓tar.gz一次。我在每個子類中使用靜態布爾變量來協調這一點。

每個子類都使用相同的(重複)代碼來確定在解壓文件之前文件是否已經解壓縮。我在問:有沒有辦法將代碼移動到超類,而不是每個子類都有一個靜態變量和重複的代碼來確定tar.gz子類是否已經解壓縮?

這裏有一些代碼希望解釋更好一點。

public abstract class SuperClassA 
{ 
    public void unpack() throws IOException 
    { 
     // default implementation to unpack the files 
     // without checking if they've been unpacked 
    } 
} 

public class SubClassA extends SuperClassA 
{ 
    private static Boolean m_firmwareUnpacked = false; 

    // Ensures the files are unpacked only once for this subclass 
    @Override 
    protected void unpack() throws IOException 
    { 
     synchronized(m_firmwareUnpacked) 
     { 
      if(m_firmwareUnpacked == false) 
      { 
       super.unpack(); 
       m_firmwareUnpacked = true; 
      } 
     } 
    } 
} 

public class SubClassB extends SuperClassA 
{ 
    private static Boolean m_firmwareUnpacked = false; 

    // Ensures the files are unpacked only once for this subclass 
    @Override 
    protected void unpack() throws IOException 
    { 
     synchronized(m_firmwareUnpacked) 
     { 
      if(m_firmwareUnpacked == false) 
      { 
       super.unpack(); 
       m_firmwareUnpacked = true; 
      } 
     } 
    } 
} 

注意每個子類使用不同的路徑來解壓文件。

正如你可以看到每個子類共享相同的代碼,以確保歸檔只是爲該子類的所有實例解壓一次。我想知道是否有一種將此代碼移到超類的好方法(但保持相同的功能,即解包SubClassA的存檔不會阻止SubClassB解壓其存檔)?

+0

您可以使用模板方法 – nachokk

+0

如果你想堅持的字段,你總是可以使用反射。只需要聲明該字段,這將完成剩下的工作:http://stackoverflow.com/questions/15439730/field-subclass-accessing-best-way-possible – 2013-07-19 20:13:32

+0

因此,每個SubClass都有自己的文件需要解壓縮? – Joel

回答

2

你可以採取的Template Method

public abstract class SuperClassA 
{ 
    //this is the template method 
    public void unpack() throws IOException 
    { 
      if(isValid()){ 
       templateUnpack(); 
       setValid(false); 
      } 

    } 

    protected abstract boolean isValid(); 

    public void templateUnpack() throws Exception { 
     //unpack code here 
    } 
    protected abstract void setValid(boolean b); 

} 

方法,並在子類中

public class SubClassA extends SuperClassA 
{ 
    private static Boolean m_firmwareUnpacked = false; 

    @Override 
    public boolean isValid(){ 
     return m_firmwareUnpacked; 
    } 


    @Override 
    protected void setValid(boolean b){ 
     m_firmwareUnpacked = b; 
    } 

} 
0

是的,只要聲明爲publicprotected(而不是private),父代的靜態變量可以被所有子類使用。然後將保持一致的值,除非其中一個子對象修改它。

+0

我認爲他不是在尋找那 – nachokk

+0

如果你仔細閱讀,我不希望SubClassA能夠影響SubClassB的被解壓縮文件的狀態。我知道他們都可以在超類中共享相同的靜態變量。我正在尋找一種避免子類中的代碼重複的好方法,如上所示。 – thomashw