Как сделать экземпляр класса, созданного в одном методе, доступным для другого однорангового метода? - PullRequest
0 голосов
/ 02 октября 2010

Есть ли способ создать несколько объектов класса в зависимости от того, сколько пользователь хочет создать? Я смог сделать это, но тогда этот экземпляр доступен только по методу, который его создал

    public void Create()
    {
        //create class objects here
    }

и теперь я не смогу использовать его в другом методе, например

    public void Use()
    {  
        //can't use class objects
    }

Ответы [ 4 ]

1 голос
/ 02 октября 2010

Попробуйте это:

public MyObject[] Create()
{
    //create class objects here and return them
    return new[] {new MyObject(), new MyObject()};
}

//later
public void Use()
{  
    MyObject[] objs = Create();
    //use your objects as you like
}
1 голос
/ 02 октября 2010

Не останавливаясь, чтобы спросить вас о ваших дизайнерских решениях, вот прямой ответ, чтобы продемонстрировать простую технику использования поля:

public class MyMainClass {
    private List<MyOtherClass> _instances = new List<MyOtherClass>();

    private void Create(int number) {
        for (int i = 0; i < number; i++) {
            this._instances.Add(new MyOtherClass());
        }
    }

    private void Use() {
        // use the first instance I created
        MyOtherClass other = this._instances[0];

        other.DoSomething();
    }
    ...
}

Поле _instances находится в MyMainClass. Это означает, что он доступен для всех методов экземпляров (нестатических) в классе, к которому он принадлежит.

Что касается того, почему вы пытаетесь это сделать, я оставлю наедине с кем-то еще.

Обновление: альтернативный метод демонстрируется Хемантом в другом ответе, посредством которого метод Create возвращает экземпляры вызывающей стороне. Однако я решил придерживаться полей, чтобы продемонстрировать более фундаментальную технику.

0 голосов
/ 02 октября 2010

В Create() вы создаете класс, но, как вы говорите, не можете использовать его вне класса.Первое, что вам нужно сделать, это изменить его так, чтобы он возвращал объект:

public SomeType Create()
{
  //code that creates the object here.
  //Lets say it gets put into a variable called ret
  return ret;
}
public void Use()
{
  SomeType st = Create();
  //use st here.
}

В качестве альтернативы, вместо метода, который использует объект, вызывающий Create, метод, который создает объект, может передать его какпараметр для Use(SomeType st).

Чтобы сделать это с несколькими объектами, нам нужно вернуть не SomeType, а объект, который содержит эти несколько объектов SomeType.Иногда нам нужны определенные свойства и методы для всей коллекции (например, счетчик, возможность перемещаться вперед и назад по коллекции и т. Д.).В этом случае мы бы вернули массив, List<SomeType>, HashSet<SomeType> или, возможно, что-то вроде Dictionary<string, SomeType>.

Если нам не нужны такие операции над коллекцией в целом, тогда онаПроще и эффективнее вернуть IEnumerable<SomeType>, который является объектом, который позволяет работать с последовательностью таких объектов, но не намного.C # имеет синтаксис именно для этого.Скажем, мы собираемся вернуть 10 таких объектов:

public IEnumerable<SomeType> Create()
{
  for(int i = 0; i != 10; ++i)
  {
    //code that creates the object here.
    //Lets say it gets put into a variable called ret
    yield return ret;
  }
}
public void Use()
{
  foreach(SomeType st in Create())
  {
    //use st here.
  }
}

Ключевое слово yield прекрасно скрывает много сложностей, связанных с IEnumerable<SomeType>, и позволяет вам просто написать код, который пропускает каждый новый объект (которыйв создаваемом коде все еще есть сложность, но не о вашей проблеме, о которой стоит беспокоиться).

0 голосов
/ 02 октября 2010

Я думаю, что вы имеете в виду объекты экземпляров определенного класса.См. здесь для введения в классы и экземпляры .

, но по существу:

public class SomeClass{
   int someData;
   void SetData(int data) {
     someData = data;
   }
   int GetData() {
      return data;
   }
}

// создайте несколько экземпляров SomeClass

var instance1 = new SomeClass ();var instance2 = new SomeClass ();

instance1.SetData (2);isntance2.SetData (3);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...