2010-11-09 16 views
1

Pourriez-vous créer un objet à partir d'une classe nommée Trung.NguyenThe puisque NguyenThe n'est pas une méthode?Puis-je créer un objet comme celui-ci dans Ruby/Java/C#?

+0

Juste une pensée: pourquoi avez-vous besoin de toute façon? Visuellement cela signifie un type "NguyenThe" à l'intérieur du type "Trung". – Kangkan

+0

Et si "NguyenThe" est un type spécial en général "Trung"? Désolé tout le monde, je suis juste curieux de faire classe en classe. –

+0

'var x = nouveau {Name =" Trung.NguyenThe "};'? ;) –

Répondre

3

En Java C# et Ruby, vous ne pouvez pas créer de variables avec un . dans le nom.

// C# and Java 
Object Trung.NguyenThe = ""; 
# Ruby 
Trung.NguyenThe = "" 

Ce nom de variable est illégal dans les trois langues.

Si vous voulez faire quelque chose de similaire, utilisez un trait de soulignement _.

// C# and Java 
Object Trung_NguyenThe = ""; 
# Ruby 
Trung_NguyenThe = "" 
+0

Ya, merci pour votre réponse.Je savais que c'est illégal de le faire, désolé pour une question ambitieuse. –

+0

@Dark, vous êtes les bienvenus. Voulez-vous dire «question ambiguë»? – jjnguy

+0

Oui, je l'ai arrangé pour être plus clair. Et puis-je faire classe en classe à Ruby? (Comme les gars m'ont montré ci-dessous) –

1

Tout d'abord, les objets n'ont pas de noms. Les classes et les variables le font.

Je vais supposer que vous poser des questions sur les classes de nommer avec des périodes (en fonction de votre dernier commentaire) ...

La réponse directe est « non », mais on peut imiter que l'utilisation namespaces/packages ou classes internes.

Espace de noms:

namespace Trung { 
    public class NguyenThe {} 
} 

// Usage: 
namespace Whatever { 
    public class Client { 
     public main() { 
      var x = new Trung.NguyenThe(); 
     } 
    } 
} 

Classe interne:

namespace Whatever { 
    public class Trung { 
     public class NguyenThe {} 
    } 

    // Usage: 
    public class Client { 
     public main() { 
      var x = new Trung.NguyenThe(); 
     } 
    } 
} 

(Note:. Ceci est du code C#, mais je suis sûr que la même chose pourrait être fait en Java je suppose que Ruby a le même concepts aussi.)

+0

Merci, c'est très utile. –

+0

Pouvez-vous faire cela dans Ruby? –

+1

@Dark Cloud: (à propos de Ruby) en quelque sorte. Vous pouvez définir la classe dans un module dans ruby, mais la syntaxe ruby ​​pour résoudre les membres du module utilise '::' au lieu de '.' (cela a du sens dans Ruby, un module est comme une classe statique, et vous pouvez utiliser'. seulement pour résoudre les membres d'instance/objet). Donc ça deviendrait 'Trung :: NguyenThe()' (ou 'Trung :: NguyenThe', qui est le même dans Ruby). – rsenna

0

Bien sûr. Créez un package appelé Trung. Dans ce paquet, créez une classe appelée NguyenThe.

Ou supposez-vous que Trung est déjà un nom de classe?

1

Dans Ruby, il n'existe pas de nom de classe. Les classes sont juste des objets comme tous les autres objets qui sont assignés aux variables comme n'importe quelle autre variable.

Trung.NguyenThe n'est pas un nom de variable juridique, donc cela est impossible:

class Object 
    klass = Class.new do 
    def to_s; 'Hello' end 
    end 
    const_set :'Trung.NguyenThe', klass 
    # NameError: wrong constant name Trung.NguyenThe 
end 

Vous pourrait, bien sûr, créer un objet qui répond à un message NguyenThe avec une classe et affecter cet objet à un variable nommée Trung, mais ce n'est pas ce que vous demandez au sujet:

klass = Class.new do 
    def to_s; 'Hello' end 
end 
(Trung = Object.new).define_singleton_method(:NguyenThe) { klass } 

puts Trung.NguyenThe.new 
# Hello 

en C# et Java, les périodes sont illégales dans les noms de classe aussi bien. C# a un mécanisme d'échappement qui vous permet d'utiliser des mots autrement réservés comme noms, mais ce mécanisme ne permet pas d'utiliser des noms illégaux, seulement des noms réservés.

Il existe des propositions pour plus de liberté symbolique dans les noms Java, mais jusqu'à présent, ils n'ont pas encore été implémentés.

+0

Désolé, je ne suis pas un vrai rubist, mais je crois que Ruby a des noms de classe. Oui, une classe est un objet, mais cela ne signifie pas qu'elle n'a pas de nom associé - même si le concept de "nom" ici est un peu différent de celui des langages statiques ... Vous pouvez même obtenir dynamiquement le nom de classe de tout objet en appelant 'obj.class.name' ... De plus, le nom de la classe est une constante, donc * devrait * être immuable. – rsenna

+0

'Class # name' est simplement une méthode pratique pour le débogage. Et en fait, cela fonctionne en analysant toutes les constantes et en vérifiant si la classe a été assignée à l'une d'elles et en retournant le nom de la constante. En d'autres termes: c'est juste le nom de la variable à laquelle la classe a été assignée. Et évidemment, cela signifie que le nom d'une classe * peut * changer, en fonction de la variable à laquelle elle est assignée: 'a = Class.new; p a.nom; A = a; p a.nom'. –