Autor Wątek: Juice it or lose it  (Przeczytany 5537 razy)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 30, 2012, 12:37:49
Cytuj
A w tradycyjnych językach obiektowych nie ma alternatywy dla globalnych klas, więc się utarło, że to nie problem :)
Jak to nie ma? Masz namespace przecież (w szczególności w Javie jest to mocno abusowany feature).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline ajuc

  • Użytkownik
    • strona domowa

# Maj 30, 2012, 15:13:20
Jak to nie ma? Masz namespace przecież (w szczególności w Javie jest to mocno abusowany feature).

Namespace to nie to samo. Nie możesz np. zaimportować biblioteki tylko na potrzebę jednej funkcji Twojej klasy. Jak jakaś funkcja ma widzieć importowaną klasę, to już cały plik .java ją widzi. I nie można "odimportować" klasy, albo zaimportować klasy tylko, jeśli użytkownik w programie kliknie chekboksa.

Tzn teraz przypomniałem sobie o classloaderach i dzięki nim da się to wszystko zrobić, więc cofam starego posta - da się to zrobić w Javie, choć wymaga grzebania się w classloaderach. No i one pozwalają na zrobienie kilku instancji singletona.

Ale imho i tak fajniejszy sposób na importowanie bibliotek jest taki, żeby nie wrzucały nic do scopa, tylko żeby import() zwracał to, co importuje.

Czyli zamiast  import java.util.Map byłoby Map = import java.util.Map.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 30, 2012, 15:31:55
Cytuj
Namespace to nie to samo. Nie możesz np. zaimportować biblioteki tylko na potrzebę jednej funkcji Twojej klasy. Jak jakaś funkcja ma widzieć importowaną klasę, to już cały plik .java ją widzi. I nie można "odimportować" klasy, albo zaimportować klasy tylko, jeśli użytkownik w programie kliknie chekboksa.
Nie wiem jak w Javie, ale w C++ możesz "importować" namespace tylko tam gdzie potrzebujesz.

if(something)
{
    if(something_else)
    {
        using std::swap;
        swap(a,b); swap(c,d); swap(d,e); ...
    }
   
    printf("o ja biedny swapa już nie widzę...\n"); // ;)
}

Offline ajuc

  • Użytkownik
    • strona domowa

# Maj 30, 2012, 16:50:26
Nie wiem jak w Javie, ale w C++ możesz "importować" namespace tylko tam gdzie potrzebujesz.

if(something)
{
    if(something_else)
    {
        using std::swap;
        swap(a,b); swap(c,d); swap(d,e); ...
    }
   
    printf("o ja biedny swapa już nie widzę...\n"); // ;)
}

Ale musisz jeszcze inkludować <algorithm> czy tam gdzie swap jest, i wszędzie w całym kodzie poniżej tego includa możesz napisać std::swap().

Using tylko dodaje alias chwilowy - nie zmienia widoczności właściwej definicji.

Offline Paweł

  • Użytkownik

# Maj 30, 2012, 17:01:35
Cytuj
si plas plas werszyn:

namespace my_very_useful_namespace_name{
#include "library.h"
}

my_very_useful_namespace_name::Class object;
ajj. nie zlinkuje sie, pomyłka.
« Ostatnia zmiana: Maj 30, 2012, 17:08:29 wysłana przez Paweł »