2015-11-30 12 views
-2

Каков правильный стиль для реализации класса скелета в Java?Каков правильный стиль для реализации класса скелета?

Скелет Я имею в виду класс, который предоставляет код утилиты скелета, но для реализации некоторых частей необходим подкласс.

В C++ я бы просто добавил в класс чистые виртуальные методы, но Java имеет строгое различие между интерфейсами и классами, поэтому это не вариант.

В основном скороговоркой должно быть что-то вроде этого:

class Skel { 
    void body() { 
    this.action1(); 
    this.action2(); 
    } 
}; 

class UserImpl : extends A { 
    void action1() { 
     impl; 
    } 

    void action2() { 
     impl; 
    } 
} 

/* ... snip ... */ 

Skel inst = new UserImpl(); 

/* ... snip ... */ 

inst.body(); 
+7

Вы не ищете абстрактный класс? – benzonico

+0

И C++? Это не законный Java-код. – EJP

ответ

3

Абстрактные методы в Java похожи на виртуальные методы в C++.

Вы должны объявить абстрактный класс Skel с абстрактными методами, и реализовать их в подклассе:

public abstract class Skel { 

    public void body() { 
     this.action1(); 
     this.action2(); 
    } 

    abstract void action1(); 
    abstract void action2(); 

} 
+1

Примечание: вы можете сделать 'body()' 'final', чтобы подкласс не переопределял его. –

0
abstract class Skel {abstract void action1(); 
    abstract void action1(); 
    abstract void action2(); 
    public void body() { 
     action1(); 
     action2(); 
    } 
} 

class UserImpl extends Skel { 
    @Override 
    public void action1() { 
     //... 
    } 
    @Override 
    public void action2() { 
     //.. 
    } 
} 

Использование абстрактного класса или даже лучше извлечь общий интерфейс, так что вы классы ссылаются им ,

interface CommonInterface { 
    void action1(); 
    void action2(); 
    void body(); 
} 

abstract class Skel implements CommonInterface{ 

    public void body() { 
     action1(); 
     action2(); 
    } 
} 

class UserImpl extends Skel { 

    @Override 
    public void action1() { 
     //... 
    } 

    @Override 
    public void action2() { 
     //.. 
    } 
}