2009-09-15 59 views
1

我希望能够创建和未知数量的对象。我不确定是否有更好的方法来管理和引用它们。管理对象实例

允许使用标准的OOP例子...说的每一个用户在文本字段的宠物输入名称并点击一个按钮一个新的宠物对象通过petFactory功能创建的时间。

function pet(name) 
{ 
     this.name= name; 
} 

function petFactory(textFieldInput) 
{ 
     var x = new pet(textFieldInput) 
} 

因为没有办法,我所知道的(除了一个eval函数),以动态地使用一个新的,唯一的变量名称为宠物每petFactory被调用时,x被重新分配给新的对象和最后的宠物丢失了。我一直在做的就是一旦初始化就将宠物对象推到一个数组上。

petArray.push(this); 

所以,如果我想命名为“mrFuzzyButtoms”宠我可以通过索引数组,直到我发现用实例变量的对象循环“mrFuzzyButtoms”

for (n in petArray) 
{ 
     if (petarray[n].name == 'mrFuzzyBottoms') 
     { 
       // Kill mrFuzzyBottoms 
     } 
} 

或者我可以使用关联数组......无论如何......但阵列是我知道这样做的唯一方法。除了使用eval函数从字符串创建唯一变量名称,但某些语言没有eval函数(actionscript3),然后存在安全风险。

有没有更好的方式来做到这一点?

编辑: 现在我正在使用Python,JavaScript和ActionScript。

+0

杀mrFuzzyBottoms?噢。虐待动物!多么糟糕!顺便说一句,它看起来像C#,但它也可能是Java。你可以添加一个语言标签,或者这对于所有的编程语言都是通用的。 – 2009-09-15 14:25:04

回答

2

这是什么集合类(列表,字典/地图,套)是;收集一些实例。对于上述情况,我可能会使用从名称到对象的地图(类名取决于语言)。

+1

在Python中,这称为“dict”,如果您不想使用泛型类型,则在C#中它是一个Dictionary 或Hashtable。 – PaulMcG 2009-09-15 17:08:34

+0

在AS3中,您应该使用一个普通的旧对象,将其视为关联数组(或包装对象的自定义类)。你也可以使用一个字典;在你的情况下,它不会有任何区别。 – fenomas 2009-09-15 17:57:36

+0

在Ruby中它是Hash,在Java中它是Map(带有子类),并且在JavaScript和actionscript中是,您倾向于使用通用对象(您也可以在Python中这样做,但通常不建议这样做)。 – 2009-09-15 22:31:06

3

“我可以使用关联数组”正确的。

“的阵列是我知道这样做的唯一方法。”

只要你可以了解“映射”或“字典”。你会发现它完全符合你的要求。

您使用什么语言?如果您提供特定的语言,我们可以提供该语言的“地图”结构的特定链接。

+0

非常感谢。我添加了语言标签。 – 2009-09-15 15:00:43

0
#!/usr/bin/env python 
"""Playing with pets.  

""" 


class Pet(object): 
    """A pet with a name.""" 
    def __init__(self, name): 
     """Create a pet with a `name`. 

     """ 
     self._name = name 

    @property 
    def name(self): # name is read-only 
     return self._name 

    def __repr__(self): 
     """ 
     >>> eval(repr(self)) == self 
     """ 
     klass = self.__class__.__name__ 
     return "%s('%s')" % (klass, self.name.replace("'", r"\'")) 

    def __eq__(self, other): 
     return repr(self) == repr(other) 

    name2pet = {} # combined register of all pets 

    @classmethod 
    def get(cls, name): 
     """Return a pet with `name`. 

     Try to get the pet registered by `name` 
     otherwise register a new pet and return it 
     """ 
     register = cls.name2pet 
     try: return register[name] 
     except KeyError: 
      pet = register[name] = cls(name) # no duplicates allowed 
      Pet.name2pet.setdefault(name, []).append(pet) 
      return pet 


class Cat(Pet): 
    name2pet = {} # each class has its own registry 


class Dog(Pet): 
    name2pet = {} 


def test(): 
    assert eval(repr(Cat("Teal'c"))) == Cat("Teal'c") 

    pets = [Pet('a'), Cat('a'), Dog('a'), Cat.get('a'), Dog.get('a')] 
    assert all(pet.name == 'a' for pet in pets) 

    cat, dog = Cat.get('pet'), Dog.get('pet') 
    assert repr(cat) == "Cat('pet')" and repr(dog) == "Dog('pet')" 
    assert dog is not cat 
    assert dog != cat  
    assert cat.name == dog.name 

    assert all(v == [Cat(k), Dog(k)] 
       for k, v in Pet.name2pet.items()), Pet.name2pet 

    try: cat.name = "cat" # .name is read-only 
    except AttributeError: 
     pass 

    try: assert 0 
    except AssertionError: 
     return "OK" 
    raise AssertionError("Assertions must be enabled during the test") 


if __name__=="__main__": 
    print test() 

pet.py

+0

感谢这个例子。 =)今晚我将不得不深入这一点。 – 2009-09-16 00:37:52