2013-10-15 43 views
1

我真的不知道該怎麼形容這種模式,我想,但我想是這樣的:Java抽象場模式

public abstract class Parent { 
    protected abstract boolean foo = false; //this doesn't compile 
} 

public class Child1 extends Parent { 
    protected boolean foo = true; 
} 

我如何做到這一點?

想象一下,我有1 Parent類,但像20 Child類。對於絕大多數的孩子,foo應該是false。然而,Child1(和其他一些)是foo = true;奇怪的一個。

什麼是最合適的面向對象設計和代碼有效的方式來做到這一點?

+2

你忘了一個類型,'boolean'。而且,只有方法和類可以是抽象的。另外,在構造函數中這樣做。 –

+0

這是什麼意思?你不能在創建子類時將它啓動到正確的值嗎? –

+0

@SotiriosDelimanolis哦,thanx爲抓。是的,因此我在它沒有編譯的評論中寫道。調用構造函數部分。 –

回答

2

你可以用一個構造函數或兩個這樣做:

public abstract class Parent { 
    protected boolean foo; 
    protected Parent() { 
     this(false); // initialize foo to default value 
    } 
    protected Parent(boolean fooValue) { 
     this.foo = fooValue; 
    } 
} 

public class Child1 extends Parent { 
    public Child1() { 
     super(true); 
    } 
} 

public class Child2 extends Parent { 
    // no explicit super(boolean) call in c'tor gives foo the default value 
} 
+0

我其實很喜歡這個 - 你在孩子的構造函數中強制使用變量初始值。 –

0

如果你想使用Child1類擴展Parent類,你必須鍵入:

public class Child1 extends Parent { 

} 

關於foo參數,你不能對它進行設置abstract,因爲不是一個函數(即只函數可以被聲明爲abstract)。但是,您可以在子類中覆蓋它。

public abstract class Parent { 
    protected boolean foo = false; 
} 

public class Child1 extends Parent { 
    @Override 
    protected boolean foo = true; 
} 
+0

這不會改變'Parent.foo'變量。您的註釋將被編譯器拒絕。 – OldCurmudgeon

+0

忘記'擴展父'。謝謝! –

2

首先,實例變量不能是abstract,只有方法可以。

要覆蓋行爲,您需要方法。我會定義一個方法,例如isFooParent中定義爲返回false。沒有任何子類需要覆蓋它,除了「奇怪的」之外,它可以覆蓋它以返回true

或者,你可以有一個Parent的子類WeirdOne(當然不一定是那個名字)。它唯一的作用是覆蓋isFoo返回true。然後Child1和任何其他「奇怪」類WeirdOne的子類。這樣,它只在一個地方被覆蓋。

0

不要使用字段則。看看類這樣的組合:

public abstract class Vehicle { 
    public abstract boolean isAerial(); 
} 

public abstract Flyer extends Vehicle { 
    @Override 
    public final boolean isAerial() { 
     return true; 
    } 
} 
// Add Airplane, Helicopter, Dirigible, Rocket, etc. 

public abstract Terrestrial extends Vehicle { 
    @Override 
    public final boolean isAerial() { 
     return false; 
    } 
} 
// Add Car, Truck, Boat, Bicycle, etc. 
1

我認爲你需要做這樣的

public abstract class Parent { 

    protected boolean check = false; 

} 

public class Child extends Parent 
{ 
    public void method() 
    { 
     this.check=true; 
    } 

} 

//你可以把它放在構造函數也