2013-10-15 4 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;.

Что является самым правильным дизайном OO и тем не менее эффективным для этого способом?

+2

Вы забыли тип, 'boolean'. Кроме того, только методы и классы могут быть абстрактными. Также сделайте это в конструкторе. –

+0

В чем смысл этого? Не можете ли вы просто начать его с правильного значения при создании подкласса? –

+0

@SotiriosDelimanolis oh, 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

На самом деле это действительно так: вы вынуждаете переменное начальное значение в конструкторе child. –

0

Если вы хотите расширить Parent класс, используя Child1 класс, вы должны ввести:

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, только методы могут.

Чтобы изменить поведение, вам нужны методы. Я бы определил метод, скажем, isFoo в Parent, который определен для возврата 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; 
    } 

} 

// Вы можете поместить его в конструктор также

Смежные вопросы