- ベストアンサー
C#のAddressBookクラスでaddressが出力されない問題の解決方法
- C#のAddressBookクラスでaddressが出力されない問題の解決方法について紹介します。AddressBookクラスはPhoneBookクラスを継承しており、住所情報を追加するためにaddressという変数を持っています。しかし、現在の実装ではaddressの値が正しく設定されず、出力されない問題が発生しています。
- addressの値が正しく設定されない理由は、Inputメソッド内でローカル変数のaddressを設定しているためです。正しくは、AddressBookクラスのaddress変数に値を代入する必要があります。
- 解決方法としては、Inputメソッド内のstring address=Console.ReadLine();の行を修正し、this.address=Console.ReadLine();とすることで、AddressBookクラスのaddress変数に値を正しく代入することができます。これにより、Writesメソッドで正しい住所情報が出力されるようになります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } /* 「元のクラスのメソッドをオーバーライドするときはnewを使え」って、 コンパイラに警告された。 */ public new void Input() { base.Input(); Console.Write("住所:"); /* 【最大の原因】stringを外した。代入するのはローカル変数じゃなくてクラスのメンバ変数だから */ address = Console.ReadLine(); } public new void Writes() { /* 個人的な好みの問題でここもnewを付け、 元のメソッドの名前をWritesに変更 */ base.Writes(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); /* 変数名には気を使おう。*/ AddressBook[] ab = new AddressBook[n]; int i; for (i = 0; i < ab.Length; i++) { ab[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); ab[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < ab.Length; i++) { if (ab[i].Search(t, s)) ab[i].Writes(); } } } } class PhoneBook{ private string Name; private string PrimaryPhoneNumber; private string SecondaryPhoneNumber; public PhoneBook(){ } public void Input(){ Console.Write("名前を入力してください:"); Name = Console.ReadLine(); Console.Write("自宅の電話番号を入力してください:"); PrimaryPhoneNumber = Console.ReadLine(); Console.Write("携帯電話の電話番号を入力してください:"); SecondaryPhoneNumber = Console.ReadLine(); } public void Writes(){ Console.WriteLine("名前:{0}",Name); Console.WriteLine("自宅の電話番号:{0}",PrimaryPhoneNumber); Console.WriteLine("携帯電話の電話番号:{0}",SecondaryPhoneNumber); } public bool Search(int x,String y){ /* StartsWith,EndsWithでも良いが, 個人的にはContainsで検索する。 この方法の問題点は 「3」とか入力されると大量にヒットすること。 */ bool result; /* 後で数を増やしたりする可能性もあるので, 個人的には 1とか2とかじゃなくて列挙体を作って対処したいが, 面倒なので放置。 */ switch(x){ case 1: result = Name.Contains(y); break; case 2: result = PrimaryPhoneNumber.Contains(y); break; case 3: result = SecondaryPhoneNumber.Contains(y); break; default: result = false; break; } return result; } } /* >質問文が倍の長さになって かえって分かりにくい そんなことはない。そのくらいは回答するときにこっちで努力する。 今回は省略されていても良い内容だったが, 省略されると,「省略した部分に問題があるのでは?」ってことを回答したくなる。 */
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
答える前に一つ。 PhoneBookクラスが書かれていないんだけど,それはどこにあるのかな?
補足
PhoneBookクラスを書くと、質問文が倍の長さになって かえって分かりにくいと思ったので・・。 PhoneBookクラスは 氏名と自宅番号と携帯番号を出力および入力し、StartsWith EndsWithを使って、氏名と自宅番号と携帯番号の一部を入力することで 検索することのできるクラスです。 (address(住所)の検索をするプログラムはありません) 最初の質問文に記述するべきでした。すいません。
お礼
省略したのは 間違いでした。 ご指摘 ありがとうございます。 (出来るだけ独力で頑張りますが・)次に質問するときには 気をつけたいと思います。本当にありがとうございました。