0

ユーザーが作成したい数に基づいて、複数のクラス オブジェクトを作成できる方法はありますか? 私はこれを行うことができましたが、そのインスタンスはそれを作成したメソッドでのみ利用可能です

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

そして今、たとえば別の方法でそれを使用することはできません

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

4 に答える 4

1

これを試して:

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
}
于 2010-10-02T10:52:50.823 に答える
1

設計上の決定について尋ねるのはやめますが、フィールドを使用する単純な手法を示すための率直な答えを次に示します。

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 です。これは、それが属するクラスのすべてのインスタンス メソッド (非静的) で使用できることを意味します。

なぜあなたがこれをやろうとしているのかについては、他の人に任せます。

更新: 別の回答で Hemant によって別の手法が示され、Create メソッドが呼び出し元にインスタンスを返します。しかし、より基本的なテクニックを示すためにフィールドに固執することにしました。

于 2010-10-02T10:52:02.230 に答える
0

あなたはクラスを作成していますが、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 オブジェクトを含むオブジェクトを返す必要があります。そのコレクション全体に関する特定のプロパティとメソッドが必要な場合があります (たとえば、カウント、コレクション内を前後に移動する機能など)。この場合、必要に応じて配列、 a List<SomeType>、 aHashSet<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>新しいオブジェクトを渡すコードを書くだけで済みます (その複雑さは生成されたコードにまだ存在しますが、心配する必要はありません)。

于 2010-10-02T11:00:17.113 に答える
0

特定のクラスのインスタンスオブジェクトを意味していると思います。クラスとインスタンスの概要については、こちらを参照してください。

しかし本質的に:

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);

于 2010-10-02T10:53:23.397 に答える