Вопрос о дизайне класса [необязательная реализация] - PullRequest
1 голос
/ 09 мая 2011

Мне было интересно, как спроектировать систему, в которой у меня есть класс Super и пара классов, которые являются подклассами Super (скажем, Sub1, Sub2, Sub3), и мне нужен класс Cool. Теперь есть две вещи, которые я хочу иметь:

Sub1 и Sub2 могут быть Cool, Sub3 никогда не может быть Cool. Я должен иметь возможность иметь список, в котором могут быть Sub1 и Sub2, если они крутые. Если, например, я создаю объект Sub1, и он классный, я могу поместить его в список, если нет, его нет в списке.

Есть предложения? Намеки?

Ответы [ 6 ]

3 голосов
/ 09 мая 2011

Ответ Арне делает то, что вы хотите, но я нахожу это слишком сложным.Может я что-то упустил?Почему бы просто:

class Super { }

interface Cool { boolean isCool(); }

class CoolImpl extends Super implements Cool {
    private boolean cool;
    public CoolImpl(boolean cool) { this.cool = cool; }
    public boolean isCool() { return this.cool; }
}

class Sub1 extends CoolImpl { }
class Sub2 extends CoolImpl { }    
class Sub3 extends Super { }

class CoolList extends ArrayList<Cool> {
    public boolean add(Cool cool) {
        if (!cool.isCool()) {
            return false;
        }
        return super.add(cool);
    }
}
3 голосов
/ 09 мая 2011

Может быть, что-то вроде этого:

class Super {}

interface Cool { boolean isCool(); }

class IsCool implements Cool {
    public boolean isCool() { return true; }
}

class NotCool impolements Cool {
    public boolean isCool() { return false; }
}

interface CoolSupporter {
    boolean isCool();
    Cool getCool();
}

class Sub1 extends Super implements CoolSupporter {
    private Cool cool;
    public Sub1() { this(new NotCool()); }
    public Sub1(Cool cool) { this.cool = cool; }
    public boolean isCool() { this.cool.isCool(); }
    public Cool getCool() { return this.cool; }
}

class Sub2 extends Super implements CoolSupporter {
    private Cool cool;
    public Sub1() { this(new NotCool()); }
    public Sub1(Cool cool) { this.cool = cool; }
    public boolean isCool() { this.cool.isCool(); }
    public Cool getCool() { return this.cool; }
}

class Sub3 extends Super {}

class CoolList {
    private List<CoolSupporter> list = new ArrayList<CoolSupporter>();
    public void add(CoolSupporter coolSupporter) {
        if (coolSupporter.isCool()) {
            list.add(coolSupporter);
        } else {
            throw new UncoolException();
        }
    }
}
2 голосов
/ 09 мая 2011

Вы можете создать интерфейс маркера, скажем, круто.Пусть класс Sub1 и Sub2 реализует этот интерфейс, и перед добавлением в список проверки может быть полезен экземпляр

.

1 голос
/ 09 мая 2011

Вы не можете иметь класс, необязательно принадлежащий типу в Java.Хотя вы можете создавать подкласс Sub1, при этом один подкласс реализует интерфейс Cool, а другой нет:

class Super { }

interface Cool { }

class Sub1 extends Super { }
class Sub1Cool extends Sub1 implements Cool { }

class Sub2 extends Super { }
class Sub2Cool extends Sub2 implements Cool { }

class Sub3 extends Super { }

class CoolList extends ArrayList<Super> {
    public boolean add(Super sup) {
        if (!(sup instanceof Cool)) {
            return false;
        }
        return super.add(cool);
    }
}

Вы также можете отказаться от концепции Cool и использовать шаблон посетителей:

class Super { 
    public boolean addTo(List<Super> coolList) {
        if (canBeAddedToCoolList()) {
            return coolList.add(this);
        }
        return false;
    }

    protected boolean canBeAddedToCoolList() {
        return false;
    }
}

class Sub1 extends Super { 

    protected boolean canBeAddedToCoolList() {
        // check logic to allow/disallow addition
    }
}
0 голосов
/ 09 мая 2011

Самым простым способом управления этим является дополнительный подкласс Sub1 (CoolSub1 и NotCoolSub1) и Sub2 (CoolSub2 и NotCoolSub2).

CoolSub1 и CoolSub2 могут затем реализовать Cool (Cool должен быть интерфейсом, а не классом)

Вы можете определить

List<Cool>

, который будет принимать реализации Sub1 и Sub2, но только если они реализуют Cool.

0 голосов
/ 09 мая 2011

IMO, вам нужен переопределенный список (скажем, MyList, который переопределяет add ()).

В add (), проверьте, является ли добавляемый вами объект классным, если это так,добавить это часть списка.Если нет, то просто изящно не обращайте на это внимания.

Помогает ли это?

...