Разница между статическим классом и одноэлементным шаблоном?

Этот код вам поможет, и это довольно понятно:

#include <stdio.h>      /* Standard Library of Input and Output */
#include <complex.h>    /* Standard Library of Complex Numbers */

int main() {

    double complex z1 = 1.0 + 3.0 * I;
    double complex z2 = 1.0 - 4.0 * I;

    printf("Working with complex numbers:\n\v");

    printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2));

    double complex sum = z1 + z2;
    printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));

    double complex difference = z1 - z2;
    printf("The difference: Z1 - Z2 = %.2f %+.2fi\n", creal(difference), cimag(difference));

    double complex product = z1 * z2;
    printf("The product: Z1 x Z2 = %.2f %+.2fi\n", creal(product), cimag(product));

    double complex quotient = z1 / z2;
    printf("The quotient: Z1 / Z2 = %.2f %+.2fi\n", creal(quotient), cimag(quotient));

    double complex conjugate = conj(z1);
    printf("The conjugate of Z1 = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate));

    return 0;
}

& nbsp; с:

creal(z1): получить действительную часть (для float crealf(z1), для длинного двойного creall(z1))

cimag(z1): получить мнимую часть (для float cimagf(z1), для long double cimagl(z1))

Еще один важный момент, который следует помнить при работе со сложными числами, состоит в том, что функции, такие как cos(), exp() и sqrt(), должны быть заменены сложными формами, например ccos(), cexp(), csqrt().

1658
задан Morteza Azizi 15 November 2015 в 15:02
поделиться

8 ответов

Что заставляет Вас сказать, что или одиночный элемент или статический метод не ориентированы на многопотоковое исполнение? Обычно оба должен быть реализованным, чтобы быть ориентированным на многопотоковое исполнение.

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

1173
ответ дан systemovich 16 November 2015 в 01:02
поделиться
  • 1
    В целом, ничто не будет более эффективным, чем просто использование SQL, LINQ к Таблицам данных и Таблицам данных / Представления данных должны будут все загрузить все записи в память и затем запросить их – Jimmy 27 May 2010 в 13:50

Статический класс является тем, который имеет только статические методы, для которых лучшее слово было бы "функциями". Стиль дизайна, воплощенный в статическом классе, является чисто процедурным.

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

50
ответ дан Morendil 16 November 2015 в 01:02
поделиться

В шаблоне "одиночка" можно создать одиночный элемент как экземпляр производного типа, Вы не можете сделать этого со статическим классом.

Быстрый Пример:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer
34
ответ дан Don Neufeld 16 November 2015 в 01:02
поделиться
  • 1
    Спасибо! Так num_rows только должен использоваться для SELECT * вместо SELECT COUNT? – Lode 1 September 2010 в 17:34

Хорошо одиночный элемент является просто нормальным классом, который инстанцируют, но только однажды и косвенно из клиентского кода. Статический класс не инстанцируют. Насколько я знаю статические методы (статический класс должен иметь статические методы), быстрее, чем нестатичный.

Редактирование:
описание правила Работы FxCop: "Методы, которые не получают доступ к данным экземпляра или называют методы экземпляра, могут быть отмечены как статичные (Совместно использованный в VB). После выполнения так, компилятор испустит сайты невиртуального вызова этим участникам, которые предотвратят проверку во времени выполнения для каждого вызова, который обеспечивает, чтобы текущий объектный указатель был непустым. Это может привести к измеримому увеличению производительности для чувствительного к производительности кода. В некоторых случаях отказ получить доступ к текущему экземпляру объекта представляет проблему правильности".
я на самом деле не знаю, применяется ли это также к статическим методам в статических классах.

12
ответ дан agnieszka 16 November 2015 в 01:02
поделиться

Singleton инстанцируют, это просто существует только один экземпляр, который когда-либо инстанцируют, следовательно единственный в Singleton.

А статический класс не может инстанцировать ничто кроме себя.

10
ответ дан Kezzer 16 November 2015 в 01:02
поделиться
  • 1
    И теперь хранимая процедура идет настолько быстро, она имеет 0 продолжительностей в профилировщике. Невероятный. Я должен быть взволнован по поводу Грузового Культового Программирования? Прямо сейчас I' m просто привел в восторг it' s зафиксированный.:-) – Andrew Shepherd 22 October 2010 в 22:18

Истинный ответ Jon Skeet, на другом форуме здесь .

одиночный элемент А предоставляет доступ к единственному созданному экземпляру - что экземпляр (или скорее ссылка на тот экземпляр) можно передать в качестве параметра другим методам и рассматривать как обычный объект.

А статический класс позволяет только статические методы.

447
ответ дан Rachel 16 November 2015 в 01:02
поделиться

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

140
ответ дан neil.johnson 16 November 2015 в 01:02
поделиться

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

Комментарий Морендила: «Стиль дизайна, воплощенный в статическом классе, - это чисто процедурный "Я могу ошибаться, но я не согласен. В статических методах вы можете получить доступ к статическим членам, что будет точно так же, как одноэлементные методы, обращающиеся к своим членам единственного экземпляра.

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

* или он может быть создан при первом использовании, я думаю, в зависимости от языка.

18
ответ дан 22 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

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