C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: クラスの動的生成について


(過去ログ 114 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■67282 / inTopicNo.1)  クラスの動的生成について
  
□投稿者/ TAKAHIRO (1回)-(2013/07/21(Sun) 22:24:33)

分類:[C#] 

C#で困っています…

class indexer1{
	
	string name;
	int nameLen = 20;
	
	string age;
	int ageLen = 3;
	
	int allLen = 23;
	
	public string LineCut(string line){
		if(line == allLen){
			name = line.Substring(0, nameLen);
			age = line.Substring(nameLen);
			
			return name + "," + age;
		}else{
			return "";
		}
	}
}

class indexer2{
	
	string job;
	int jobLen = 10;
	
	string saraly;
	int salaryLen = 8;
	
	int allLen = 18;
		
	public void LineCut(string line){
		if(line == allLen){
			job = line.Substring(0, jobLen);
			saraly = line.Substring(jobLen);
			
			return job + "," + "salary";
		}else{
			return ""
		}
	}
}

class mainLogic{
	
	// 第1パラメータ:class_ID、第2パラメータ:文字列
	public static void Main(string[] args)
	{
		string line = args[1];
		
		string cutLine = …
	}
}

/////////////////////////////////////////////////////////////

クラスmainLogicのコマンドライン引数は以下を予定しております。
   第1パラメータ:indexer1 or indexer2
   第2パラメータ:名前(20文字)と年齢(3文字)が繋がったもの or 職業(10文字)と給料(8文字)が繋がったもの
           例:前者なら→TANAKA TARO         025(計23文字)
             後者なら→ENGINEER  00250000(計18文字)

上記PGMがあり、もしclass mainLogicの第1パラメータが"indexer1"、
第2パラメータが"TANAKA TARO         025"なら、class indexer1を生成したのち、
メソッドLinCutにて"TANAKA TARO         ,025"をmainLogicに返したいです。

同様に、第1パラメータが"indexer2"、第2パラメータが"ENGINEER  00250000"なら
class indexer2を生成したのち、メソッドLinCutにて"ENGINEER  ,00250000"を返したいです。

このように、パラメータに応じて生成するクラスを変える事はできますでしょうか。
もしくは、第1パラメータを"1"や"2"に変え、switch文等の分岐をさせ、全てのクラスindexer分を
記述するしかないでしょうか。

クラスindexerXは大量にあり、今後も増やしていきたいので、出来ればコマンドライン引数を元に
動的にクラスを生成するようコーディングしたいです。

ご回答お願い致します。

引用返信 編集キー/
■67284 / inTopicNo.2)  Re[1]: クラスの動的生成について
□投稿者/ バーバラ (1回)-(2013/07/21(Sun) 23:23:38)
mainLogicではindexer1やindexer2(以下、indexerXとする)の実体は使っているのでしょうか?
コードを見る限り、単にindexerXのLineCutメソッドを使うだけで、
それならばわざわざindexerXのインスタンス生成を行うのはすごく無意味のような気がしますが。
他にどのようにindexerXの実体を利用しているか分かりませんので、インタフェースを使うべきかどうか、
アドバイスに困ります。

あと、indexer2のLineCutメソッドはvoidではなく戻り値の型はstringですよね?
引用返信 編集キー/
■67288 / inTopicNo.3)  Re[1]: クラスの動的生成について
□投稿者/ Jitta (48回)-(2013/07/22(Mon) 22:47:12)
Jitta さんの Web サイト
No67282 (TAKAHIRO さん) に返信
> クラスmainLogicのコマンドライン引数は以下を予定しております。
>    第1パラメータ:indexer1 or indexer2
>    第2パラメータ:名前(20文字)と年齢(3文字)が繋がったもの or 職業(10文字)と給料(8文字)が繋がったもの
>            例:前者なら→TANAKA TARO 025(計23文字)
>              後者なら→ENGINEER 00250000(計18文字)

 20文字と3桁、10文字と8桁というのが決まっているなら、1行読み込んだら判断できるので、第1引数はいらないのでは?

>
> 上記PGMがあり、もしclass mainLogicの第1パラメータが"indexer1"、
> 第2パラメータが"TANAKA TARO 025"なら、class indexer1を生成したのち、
> メソッドLinCutにて"TANAKA TARO ,025"をmainLogicに返したいです。
>
> 同様に、第1パラメータが"indexer2"、第2パラメータが"ENGINEER 00250000"なら
> class indexer2を生成したのち、メソッドLinCutにて"ENGINEER ,00250000"を返したいです。

 indexer1 クラスや indexer2 クラスのインスタンスを返すのではなく?


> このように、パラメータに応じて生成するクラスを変える事はできますでしょうか。
> もしくは、第1パラメータを"1"や"2"に変え、switch文等の分岐をさせ、全てのクラスindexer分を
> 記述するしかないでしょうか。

 その方が良いと思います。リフレクションを使ってできますが、その場合、型付き言語の恩恵を受けられません。
引用返信 編集キー/
■67289 / inTopicNo.4)  Re[2]: クラスの動的生成について
□投稿者/ panic (7回)-(2013/07/22(Mon) 23:52:03)
そもそも読んでて思うのは indexer1 クラスや indexer2 クラスというものを抽象的に表現できるんじゃないのかしら。
そうなら分岐自体不要。
引用返信 編集キー/
■67290 / inTopicNo.5)  Re[3]: クラスの動的生成について
□投稿者/ επιστημη (62回)-(2013/07/23(Tue) 04:50:44)
επιστημη さんの Web サイト
...つまりはこーゆーことがやりたいんかの?

using System;
using System.Collections.Generic;

delegate object Create(string arg);

class Apple {
  public override string ToString() { return "私はApple"; }
  // argが条件を満たすなら、インスタンスを返す
  public static object create(string arg) {
    return ( arg == "apple" ) ? new Apple() : null;
  }
}

class Banana {
  public override string ToString() { return "私はBanana"; }
  public static object create(string arg) {
    return ( arg == "banana" ) ? new Banana() : null;
  }
}

class Cherry {
  public override string ToString() { return "私はCherry"; }
  public static object create(string arg) {
    return ( arg == "cherry" ) ? new Cherry() : null;
  }
}

class Program {

  static IList<Create> creator = new List<Create>();

  static object create(string arg) {
    foreach ( var c in creator ) {
      object result = c(arg);
      if ( result != null ) return result;
    }
    return null;
  }

  public static void Main() {
    // クラス生成器に登録する
    creator.Add(Apple.create);
    creator.Add(Banana.create);
    creator.Add(Cherry.create);

    // 文字列からクラスを生成する
    Console.WriteLine(create("banana"));
    Console.WriteLine(create("apple"));

  }
}

引用返信 編集キー/
■67293 / inTopicNo.6)  Re[1]: クラスの動的生成について
□投稿者/ shu (353回)-(2013/07/23(Tue) 10:16:13)
2013/07/23(Tue) 10:21:56 編集(投稿者)
No67282 (TAKAHIRO さん) に返信

書いてある通りの実装に近いと思われるものです。

namespace MyIndexers
{
	public interface Iindexer
	{
		string LineCut(string line);
	}

	public class indexer1:Iindexer
	{
		string name;
		int nameLen = 20;

		string age;
		int ageLen = 3;

		int allLen = 23;

		string Iindexer.LineCut(string line)
		{
			if (line.Length == allLen)
			{
				name = line.Substring(0, nameLen);
				age = line.Substring(nameLen);

				return name + "," + age;
			}
			else
			{
				return "";
			}
		}
	}

	public class indexer2:Iindexer
	{
		string job;
		int jobLen = 10;

		string saraly;
		int salaryLen = 8;

		int allLen = 18;

		string Iindexer.LineCut(string line)
		{
			if(line.Length == allLen){
				job = line.Substring(0, jobLen);
				saraly = line.Substring(jobLen);

				return job + "," + saraly;
			}else{
				return "";
			}
		}
	}

}



使う方(とりあえずFormにTextBox配置で実装してみました)

using System.Reflection;

	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
            // 実行されれているファイルを取得
			Assembly exeasm = Assembly.GetExecutingAssembly();

                        // textBox1に入力された型名の型情報を取得(名前空間は固定)
			Type IndexerType = exeasm.GetType("MyIndexers." + textBox1.Text);

                        // 型情報からインスタンスを作成
                        // Iindexerインターフェースを実装しているのでキャストが可能
			Iindexer inst = (Iindexer)Activator.CreateInstance(IndexerType);

                        // LineCutを実行
			textBox3.Text = inst.LineCut(textBox2.Text);
		}
	}

引用返信 編集キー/
■67323 / inTopicNo.7)  Re[2]: クラスの動的生成について
□投稿者/ Jitta (49回)-(2013/07/24(Wed) 23:42:08)
Jitta さんの Web サイト
 気がついたんだけど、タイトルが、「クラスの」動的生成、なんよね。
クラスを作りたいの?質問文は、そうじゃないんだけど。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -