もっと詳しくArrayクラスについて調べるには → キーワード検索 (3) 「検索する文字列」に「Array」を入力 (2) 「フィルタ条件」を「Visual C#および関連項目」にする (4) 表示されるリスト中から一つのトピックスを選ぶ (1) 「キーワード」タブをポイントする
文字列を表わすstring型 string型の変数宣言. 同時に初期化も行っている. 日本語OK. stringはオブジェクト. Lengthプロパティで文字列の長さを取得. '+'演算子はオーバーロードされている. 文字列を連結する. '=='演算子もオーバーロードされている. 文字列が全く同じならtrueになる. using System; class kadai6 { public static void Main() { string s1 = "今日は"; string s2 = "基礎計算機演習の"; string s3 = "日だ"; Console.WriteLine("文字列「{0}」は{1}文字だ", s1, s1.Length); string s4; s4 = s1 + s2 + s3; Console.WriteLine("全部あわすと「{0}」", s4); if (s1 == s2) Console.WriteLine("同じ文字列"); else Console.WriteLine("違う文字列"); } } 文字列「今日は」は3文字だ 全部あわすと「今日は基礎計算機演習の日だ」 違う文字列 Press any key to continue
C#言語の変数の真実 → すべての変数はオブジェクト クラスのメンバを詳しく知るためにはクラス名をキーワード検索 C言語 C#言語 クラス/構造体名 説明 char sbyte Sbyte ANSI文字,または小さな数値 unsigned char byte Byte 符号無し.ANSI文字,または小さな数値 short Int16 小さな数値 Char Unicode文字(日本語もOK) int Int32 一般的な整数値 unsigned int uint UInt32 符号無しのint long 基本的にintと同じ Int64 巨大な整数値 float Float 単精度浮動小数点(実数値).有効桁数7桁 double Double 倍精度浮動小数点(実数値).有効桁数15 ~ 16 桁 decimal Decimal 有効桁数 28 ~ 29桁の高精度実数値 string String Unicode文字の文字列(日本語OK) bool Boolean 真 と 偽 を表わす型 例えば,intはInt32の別名である
int型のメンバの利用例 静的・・・ は頭にクラス名が必要 intの静的プロパティ int.MaxValue, int.MinValue 静的・・・ は頭にクラス名が必要 using System; class kadai6 { public static void Main() { Console.WriteLine("int型の最大値は{0},最小値は{1}だ", int.MaxValue, int.MinValue); int x; x = int.Parse("1232"); string s; s = Console.ReadLine(); x = int.Parse(s); } } intの静的メソッド int int.Parse(string s) 文字列sをint型の数値に変換して返す Consoleクラスの静的メソッド stirng Console.ReadLine() コンソールから一行分の文字列を入力して返す この2行をまとめて書くと x = int.Parse(Console.WriteLine()) となる.
オブジェクト指向を表わす三つの言葉 カプセル化 継承性 多態性
なぜ継承が必要か? プログラマAさん (オブジェクトの設計者) プログラマBさん (オブジェクトの利用者) クラス AA 提供されているクラスAAは,作成したいプログラムにほぼ適しているが,一部だけ変えたいところがある.少しだけ手直ししたクラスABが欲しい. 別の利用者に新しいクラスACを提供したいが,それはAAとよく似ているので,できるだけAAを利用してソースコードを減らしたい. 継承 継承 新クラス AC 新クラス AB
継承の概念と用語 元クラスAA 元のクラス メンバー(フィールド) 変数x,変数y 配列z 新クラス 新クラスAB 追加メンバー 変数 v 派生する 導出する ベースクラス スーパークラス 基本クラス 親クラス 派生クラス サブクラス 導出クラス 子クラス 継承の概念と用語 プロパティ p1 元クラスAA メンバー(フィールド) 変数x,変数y 配列z 新クラスAB 追加メンバー 変数 v メソッド func1 元のクラス 新クラス プロパティ p2 メソッド func2 新プロパティ p2 新メソッド func2 メソッドの再定義 (関数定義の変更) → オーバーライド
クラスTimeを継承した,クラスMyTimeの定義 継承のプログラム例(1) ベースクラス(親クラス) クラスTimeを継承した,クラスMyTimeの定義 class Time { private int min; public void Add(Time t) min = min + t.min; } public void Write() Console.Write("{0}時{1}分\n", Hour, Minute); public int Minute get { return min%60; } set { int h = min/60; min = h * 60 + value; public int Hour get { return min/60; } int m = min%60; min = value * 60 + m; class MyTime : Time { public bool IsAM // 午前中ならtrueを返す { get { if (Hour < 13) return true; return false; } } } 時が13未満なら 午前中と判定・・・? ベースクラスTimeのプロパティ class kadai70 { static void Main() { MyTime t = new MyTime(); t.Hour = 13; t.Minute = 30; if (t.IsAM) Console.WriteLine("午前"); else Console.WriteLine("午後"); } } 派生クラスMyTimeのプロパティ
キーワードprotectedは,クラス外からはアクセス不可だが,派生クラスからはアクセス可であることを宣言する 継承のプログラム例(2) class MyTime : Time { public bool IsAM // 午前中ならtrueを返す { get { if (min < 720) return true; return false; } } } 改良 minが720(=12*60)未満なら午前中と判定 理由:メンバminはTimeクラスのプライベートメンバであり,MyTimeクラスからはアクセスできない キーワードprotectedは,クラス外からはアクセス不可だが,派生クラスからはアクセス可であることを宣言する class Time { private int min; public void Add(Time t) { ・・・ } public void Write() public int Minute public int Hour } class Time { protected int min; public void Add(Time t) { ・・・ } public void Write() public int Minute public int Hour }
× ○ アクセス修飾子のまとめ アクセス範囲 private protected public クラスの作成者のみが使える クラス外 派生クラス内 クラス内 private × ○ protected public クラスの利用者なら誰でも使える 派生クラスを作成する人は使える その他に,internal,prtected internal等のアクセス修飾子があるが,説明省略
キーワードbaseはベースクラスのメンバを指定する メソッド・プロパティのオーバーライド 派生クラスのHourプロパティ 12時間制の時を取得(注:設定は24時間制) class Time { protected int min; public void Add(Time t) min = min + t.min; } public void Write() Console.Write("{0}時{1}分\n", Hour, Minute); public int Minute get { return min%60; } set { int h = min/60; min = h * 60 + value; public int Hour get { return min/60; } int m = min%60; min = value * 60 + m; class MyTime : Time { public bool IsAM // 午前中ならtrueを返す { get { return (min < 720); } } public int Hour get { return base.Hour % 12; } set { base.Hour = value; } } こちらを 呼び出す キーワードbaseはベースクラスのメンバを指定する class kadai70 { static void Main() { MyTime t = new MyTime(); t.Hour = 13; t.Minute = 30; Console.WriteLine("時刻は{0}時", t.Hour); } } ベースクラスのHourプロパティ 24時間制の時を取得・設定 時刻は1時
クラスの階層構造とクラスライブラリ クラス Object 継承 全てのクラスの元になる スーパー ベースクラス Object クラス A クラス X 継承 継承 クラス B クラス Y 継承 継承 C#では,プログラマが定義したクラスは自動的にObjectクラスを継承している →Objectクラスのメソッドを用いることができる クラス C クラス Z 継承 継承 クラス D1 クラス U1 クラス D2 クラス U2 クラス D3
暗黙的なクラスの継承 ToString()メソッドはそのままではクラス名を文字列として返す クラスObjectから継承されたメソッド class Time: Object となっていなくても,自動的にクラスObjectを継承している class Time { protected int min; public void Add(Time t) min = min + t.min; } public void Write() Console.Write("{0}時{1}分\n", Hour, Minute); public int Minute { } public int Hour { } class MyTime : Time public bool IsAM // 午前中ならtrueを返す { get { return (min < 720); } } public int Hour get { return base.Hour % 12; } set { base.Hour = value; } class kadai70 { static void Main() { MyTime t = new MyTime(); t.Hour = 13; t.Minute = 30; string s = t.ToString(); Console.WriteLine("sを表示すると,{0}", s); Console.WriteLine("tを表示すると,{0}", t); } } sを表示すると,MyTime tを表示すると,MyTime ToString()メソッドはそのままではクラス名を文字列として返す Console.WriteLine()関数でMyTimeのインスタンスtを表示できる → 実はConsole.WriteLine()はt.ToString()を呼び出している
Objectクラスから継承されたメソッドのオーバーライド class Time { protected int min; // 省略 } class MyTime : Time public bool IsAM // 午前中ならtrueを返す { get { return (min < 720); } } public int Hour get { return base.Hour % 12; } set { base.Hour = value; } public override string ToString() string s = string.Format("{0}:{1}", Hour, Minute); return s; キーワードoverride システムで提供されるメソッドのオーバーライドでは一般にこれが必要 class kadai70 { static void Main() { MyTime t = new MyTime(); t.Hour = 13; t.Minute = 30; Console.WriteLine("時刻は{0}だ~!", t); } } 時刻は1:30だ~! Console.WriteLine()が利用できる! → t.ToString()が呼び出されて,インスタンスtの内容が表示されている. string.Format()静的メソッド Console.WriteLine()と同様の形式で文字列を生成するメソッド ToString()メソッドのオーバーライド