2012-02-21 40 views
2
public abstract class SoftwareComponent { 

    private Set<Information> generateInfo = new HashSet<Information>(); 
    private Set<Information> consumeInfo = new HashSet<Information>(); 
    public Set<Infomation> getGeneratedInfo() { ... } 
    public Set<Information> getConsumedInfo() {....} 
} 

public class SensorDriver extends SoftwareComponent { 

} 

public class Information { ... } 

public class SensorMeasurement extends Information { } 

public class command extends Information {  } 

上面提到的代碼是我的程序結構。現在,情況是傳感器驅動程序繼承其所有父類方法 。我想限制傳感器驅動程序中覆蓋的方法的範圍。在Java繼承中限制重寫方法的範圍

限制爲 「傳感器驅動程序」只能生成「傳感器測量」信息。 「傳感器驅動程序」不允許使用「命令」信息。

+4

你不能。這會打破繼承的概念。基類可以做的任何事情,你的子類需要尊重。 – 2012-02-21 17:47:46

+0

我無法理解這個問題。你能否改變你的措辭? – Jivings 2012-02-21 17:47:53

+0

讓我試着重述一下我的問題:「是否有任何方法來限制Java中子類中的重載方法的範圍?」 – Pankesh 2012-02-21 17:52:09

回答

2

你可以讓你SoftwareComponent通用,使信息的參數:

public abstract class SoftwareComponent<I extends Information> { 

    private Set<I> generateInfo = new HashSet<I>(); 
    private Set<I> consumeInfo = new HashSet<I>(); 
    public Set<I> getGeneratedInfo() { ... } 
    public Set<I> getConsumedInfo() {....} 
} 

public class SensorDriver extends SoftwareComponent<SensorMeasurement> { 
} 
+0

感謝Ozan,您的解決方案在我的代碼中完美工作。 – Pankesh 2012-02-21 23:23:54

+0

@PankeshPatel:不客氣,如果你可以如此善良,並將我的回答標記爲已接受? – Ozan 2012-02-22 15:33:08

+0

對不起ozan,我是新的在stackoverflow(僅2天)。我有3個聲望。有了這些聲譽,我不被允許標記。我真的很抱歉。 :) – Pankesh 2012-02-22 16:56:06

0

任何你看單繼承的答案時,你可能會遇到的問題。我想你實際上想要使用多重繼承(以接口的形式)。您應該考慮聲明允許您執行某些操作的接口,或者實現某些將邏輯類「組合」在一起的接口的抽象類。

作爲一般的經驗法則,如果B是A,它將繼承A的全部。但是如果B除了x,y和z之外是A,則可以拋出一個UnsupportedOperationException,在某些情況下可以接受,但你應該真的考慮重構你的層次結構,所以這一切更有意義。