Java абстрактный класс посоветуйте - PullRequest
1 голос
/ 11 января 2012

У меня в приложении несколько разных типов пользователей (разных классов)

User1

User2

и т. Д.

Я хочу иметь абстрактный класс «Пользователь», который присоединяется к одному и тому жеметоды для всех типов пользователей, например: getId(), getAge()....

Я не знаю, как это работает, но я хочу сделать что-то вроде:

User.setType(2); //a kind a constructor
User.getId()... //etc .. the getId() method of the Users2 class

Без необходимости создания экземпляраабстрактный класс Пользователь

Как я могу это сделать?У меня проблема в том, что абстрактный класс не может иметь статические методы ... и пользователь должен быть статическим или Singleton, я не знаю, что лучше.

кто-нибудь может дать мне несколько советов?

Спасибо

Ответы [ 4 ]

1 голос
/ 11 января 2012

Я не знаю, как это работает, но я хочу кое-что сделать. как: ... без создания экземпляра абстрактного класса User

Вы не можете создать экземпляр абстрактного класса.

У меня проблема в том, что абстрактный класс не может иметь статические методы

Да, может.

и пользователь должен быть статичным или синглтоном, я не знаю, что лучше.

Есть ли когда-либо только один User экземпляр? Ваш вопрос нуждается в уточнении. В чем конкретно ваша проблема?

1 голос
/ 11 января 2012
public abstract class User {
    private int age;
    private int id;

    public int getAge() { return age; }
    public int getId() { return id; }
}


public class User1 extends User { }
public class User2 extends User { }

User user1 = new User1();
user1.getId();
User user2 = new User2();
user2.getId();

Без необходимости создания экземпляра абстрактного класса. Пользователь

Не удается создать экземпляры абстрактных классов.

Пользователь должен быть статическим или однопользовательским.не знаю, что лучше.

Несмотря на то, что абстрактные классы могут иметь статические методы, это не совсем имеет смысла (особенно если вам нужен абстрактный User и несколько конкретных типов Users).

0 голосов
/ 11 января 2012

Самое чистое было бы сделать User, интерфейс и определить класс фабрики. Вот версия (которая слегка нарушает понятие «фабричный класс») с фабрикой как статическим классом (ее также можно определить как одноэлементный класс):

public interface User {
    int getId();
}

public class UserFactory() {
    private final User sInstance;

    public static void initFactory(int type) {
        switch (type) {
        case 1:
            sInstance = new User1();
            break;
        case 2:
            sInstance = new User2();
            break;
        default:
            throw new IllegalArgumentException("error message");
        }
    }

    public static User getUser() {
        if (sInstance == null) {
            throw new IllegalStateException("Must initialize factory first");
        }
        return sInstance;
    }

    private static class User1 implements User {
        public int getId() {
            . . .
        }
    }

    private static class User1 implements User {
        public int getId() {
            . . .
        }
    }
}
0 голосов
/ 11 января 2012

фильтрует общие методы Пользователь1 и Пользователь2 . Теперь Имейте абстрактный класс Пользователь с общими методами, как показано ниже

public abstract class User{

public void commonmethod1();

public void commonmethod2();

}

Теперь определите два пользовательских класса User1 и User2, которые должны иметь по крайней мере один дополнительный метод, как показано ниже

public class User1 extends User{

public void commonmethod1(){}

public void commonmethod2(){}

public void extramethod1(){}

}

public class User2 extends User{

public void commonmethod1(){}

public void commonmethod2(){}

public void extramethod12(){}

}

решить, что делать с подклассами, синглтон ограничивает состояниеобъекта и иногда это рассматривается как анти-шаблон.

...