Обработка классов как первоклассные объекты

Я не знаю, поможет ли это вам.

private long timeMillions = 0;

    public void doSomething(){
        // if within 5 seconds
        if(System.currentTimeMillis() < timeMillions + 5 * 1000){
            //retrun or do some thing else
            return;
        }else{
            // after 5 seconds
            timeMillions = System.currentTimeMillis();
            System.out.println("do something");
        }
    }
5
задан nbro 16 April 2017 в 14:49
поделиться

6 ответов

Чтобы класс был объектом первого класса, язык должен поддерживать выполнение вещей как разрешение функций посещать уроки (не экземпляры) как параметры, смочь содержать классы в контейнерах и смочь возвратить классы из функций.

Для примера языка с классами первого класса рассмотрите Java. Любой объект является экземпляром своего класса. Тот класс является самостоятельно экземпляром java.lang. Класс.

8
ответ дан 18 December 2019 в 06:23
поделиться

В Java каждый класс является объектом в и себя, полученный из java.lang. Класс, который позволяет Вам информация о доступе о том классе, его методы и т.д. из программы. C++ не похож на это; классы (в противоположность объектам этого) не действительно доступны во времени выполнения. Существует средство под названием RTTI (Информация о типах во время выполнения), которая позволяет Вам сделать некоторые вещи вдоль тех строк, но это довольно ограничено, и я верю, имеет затраты на производительность.

4
ответ дан 18 December 2019 в 06:23
поделиться

Для всех других вот полная кавычка:

"Уменьшенное разделение на подклассы. Метод фабрики (107) часто производит иерархию классов Создателя, которая параллельна иерархии классов продукта. Опытный шаблон позволяет Вам клонировать прототип вместо того, чтобы спросить метод фабрики сделать новый объект. Следовательно Вам не нужна иерархия классов Создателя вообще. Это преимущество применяется, прежде всего, к языкам как C++, которые не рассматривают классы как первоклассные объекты. Языки, которые, как Smalltalk и Objective C, действительно получают меньше преимущества, так как можно всегда использовать объект класса в качестве создателя. Объекты класса уже действуют как прототипы на этих языках". - GoF, страница 120.

Как Steve выражается,

Я нашел это тонким в так, поскольку, возможно, понял это как допущение, что/instances/классов не рассматривают, первый класс возражает в C++. Если те же слова, используемые GoF, появились в менее формальной установке, они, возможно, предназначили/instances/, а не классы. Различие не может казаться тонким/you/./I/, однако, действительно должен был уделить ему некоторое внимание.

Я действительно полагаю, что различие важно. Если я не ошибаюсь, нет никакого требования, чем скомпилированная программа C++ сохраняет какой-либо артефакт, которым класс, от который создается объект, мог быть восстановлен. IOW, для использования терминологии Java, нет никакого объекта/Class/.

7
ответ дан 18 December 2019 в 06:23
поделиться

Вы использовали Python, который является языком с первоклассными классами. Можно передать класс функции, сохранить его в списке и т.д. В примере ниже, функция new_instance () возвращает новый экземпляр класса, это передается.

class Klass1:
    pass

class Klass2:
    pass

def new_instance(k):
    return k()

instance_k1 = new_instance(Klass1)
instance_k2 = new_instance(Klass2)

print type(instance_k1), instance_k1.__class__
print type(instance_k2), instance_k2.__class__
2
ответ дан 18 December 2019 в 06:23
поделиться

Шаблонное метапрограммирование предложило C++ больше способов играть с классами, но быть честным я не думаю, что существующая система позволяет полный спектр операционных людей, может хотеть сделать (главным образом, нет никакого стандартного способа обнаружить все методы, доступные классу или объекту). Это не контроль, это дизайном.

2
ответ дан 18 December 2019 в 06:23
поделиться

C# и программы Java могут знать об их собственных классах, потому что и.NET и Среды выполнения Java обеспечивают отражение, которое, в целом, позволяет программе иметь информацию о своей собственной структуре (и в.NET и в Java, эта структура, оказывается, с точки зрения классов).

Нет никакого способа, которым можно предоставить отражение, не полагаясь на среду выполнения, потому что программа не может быть обладающей самосознанием itself*. Но если осуществление Вашей программы организовано временем выполнения, то программа может иметь информацию о себе от времени выполнения. Так как C++ компилируется в собственный, неуправляемый код, нет никакого способа, которым можно предоставить отражение в C++ **.

...

* ну, нет никакой причины, почему программа не могла прочитать свой собственный машинный код, и "пытаются сделать заключения" о себе. Но я думаю, что это - что-то, что никто не хотел бы сделать.

** Не строго точный. Используя ужасные макрооснованные взломы, можно достигнуть чего-то подобного отражению, пока иерархия классов имеет единственный корень. MFC является примером этого.

2
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: