こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#について

using System;
class AddressBook: PhoneBook
{
private string address;
public AddressBook() : base()
{
address="";
}
public void Input()
{
base.Input();
Console.Write("住所?");
string address=Console.ReadLine();
}
public void Writes()
{
base.Write();
Console.WriteLine("住所:{0}",address);

}
}
class kadai62
{
public static void Main()
{
Console.Write("電話帳に入力する人数を入れてください:");
int n = int.Parse(Console.ReadLine());
AddressBook[] pb = new AddressBook[n];
int i;
for (i = 0; i < pb.Length; i++)
{
pb[i] = new AddressBook();
Console.WriteLine("{0}番目を入力してください.", i+1);
pb[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 < pb.Length; i++)
{
if (pb[i].Search(t, s))
pb[i].Writes();
}
}
}
}

このプログラムで public void Writes()
{
base.Write();
Console.WriteLine("住所:{0}",address);

}
のaddressが出力されません・・どうすれば 出力されますか?

投稿日時 - 2007-11-28 16:14:48

QNo.3554132

すぐに回答ほしいです

質問者が選んだベストアンサー

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;


}

}

/*
>質問文が倍の長さになって かえって分かりにくい
そんなことはない。そのくらいは回答するときにこっちで努力する。

今回は省略されていても良い内容だったが,
省略されると,「省略した部分に問題があるのでは?」ってことを回答したくなる。
*/

投稿日時 - 2007-11-28 21:54:52

お礼

省略したのは 間違いでした。
ご指摘 ありがとうございます。
(出来るだけ独力で頑張りますが・)次に質問するときには 気をつけたいと思います。本当にありがとうございました。

投稿日時 - 2007-12-02 21:13:17

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

答える前に一つ。
PhoneBookクラスが書かれていないんだけど,それはどこにあるのかな?

投稿日時 - 2007-11-28 17:45:59

補足

PhoneBookクラスを書くと、質問文が倍の長さになって かえって分かりにくいと思ったので・・。
PhoneBookクラスは 氏名と自宅番号と携帯番号を出力および入力し、StartsWith EndsWithを使って、氏名と自宅番号と携帯番号の一部を入力することで 検索することのできるクラスです。
(address(住所)の検索をするプログラムはありません)

最初の質問文に記述するべきでした。すいません。

投稿日時 - 2007-11-28 20:30:14

あなたにオススメの質問