中の人の徒然草26
そして、投稿件数を見てビックリしました127件ってw
自分が思っていた以上にネタが私の中にたまっていたようです。まだまだ書き足りないのにもう127件とは本当にビックリしました。われながら良くこんなにも書いたもんだ。
なにはともあれ、これにて本日の筆を下ろします。皆様、また明日お会いしましょう。
情報処理技術全般を気まぐれにつつくゆるいブログです。技術解説記事のソースは専門書と実務経験です。
Imports System
Public Class Program
Private Delegate Function SimpleComputer( _
ByVal val As Byte, ByVal val1 As Byte) As Double
Private Shared Function Add( _
ByVal val As Byte, ByVal val1 As Byte) As Double
Dim rval As Double = CType(val, Double) + CType(val1, Double)
Console.Write("{0}と{1}の足し算を行います。", val, val1)
Console.Write("答えは【{0}】です。" & vbLf, rval)
Return rval
End Function
Private Shared Function Subtract( _
ByVal val As Byte, ByVal val1 As Byte) As Double
Dim rval As Double = CType(val, Double) - CType(val1, Double)
Console.Write("{0}と{1}の引き算を行います。", val, val1)
Console.Write("答えは【{0}】です。" & vbLf, rval)
Return rval
End Function
Private Shared Function Multiply( _
ByVal val As Byte, ByVal val1 As Byte) As Double
Dim rval As Double = CType(val, Double) * CType(val1, Double)
Console.Write("{0}と{1}の掛け算を行います。", val, val1)
Console.Write("答えは【{0}】です。" & vbLf, rval)
Return rval
End Function
Private Shared Function Divide( _
ByVal val As Byte, ByVal val1 As Byte) As Double
Dim rval As Double = CType(val, Double) / CType(val1, Double)
Console.Write("{0}と{1}の割り算を行います。", val, val1)
Console.Write("答えは【{0}】です。" & vbLf, rval)
Return rval
End Function
Private Shared Function Calculate( _
ByVal val As Byte, ByVal val1 As Byte, ByRef fun As SimpleComputer) _
As Double
fun(val, val1)
End Function
Private Shared Sub SingleExe()
Console.WriteLine("********************" & _
"一つずつメソッドを呼び出して計算します********************")
Dim ran As Random = New Random( _
CType(Math.Min(DateTime.Now.Ticks, Integer.MaxValue), Integer))
Dim val As Byte = CByte(ran.Next(1, 100))
Dim val1 As Byte = CByte(ran.Next(1, 100))
Calculate(Val, val1, AddressOf Add)
val = CByte(ran.Next(1, 100))
val1 = CByte(ran.Next(1, 100))
Calculate(Val, val1, AddressOf Subtract)
val = CByte(ran.Next(1, 100))
val1 = CByte(ran.Next(1, 100))
Calculate(Val, val1, AddressOf Multiply)
val = CByte(ran.Next(1, 100))
val1 = CByte(ran.Next(1, 100))
Calculate(Val, val1, AddressOf Divide)
Console.WriteLine("")
End Sub
Private Shared Sub MultiExe()
Console.WriteLine("********************" & _
"一度にメソッド呼び出して計算します********************")
Dim addfun As SimpleComputer = New SimpleComputer(AddressOf Add)
Dim subfun As SimpleComputer = New SimpleComputer(AddressOf Subtract)
Dim mulfun As SimpleComputer = New SimpleComputer(AddressOf Multiply)
Dim divfun As SimpleComputer = New SimpleComputer(AddressOf Divide)
Dim allfun As SimpleComputer = Nothing
allfun = CType(System.Delegate.Combine(allfun, addfun), SimpleComputer)
allfun = CType(System.Delegate.Combine(allfun, subfun), SimpleComputer)
allfun = CType(System.Delegate.Combine(allfun, mulfun), SimpleComputer)
allfun = CType(System.Delegate.Combine(allfun, divfun), SimpleComputer)
Dim ran As Random = New Random( _
CInt(Math.Min(DateTime.Now.Ticks, Integer.MaxValue)))
Dim val As Byte = CByte(ran.Next(1, 100))
Dim val1 As Byte = CByte(ran.Next(1, 100))
Calculate(val, val1, allfun)
Console.WriteLine("")
Console.WriteLine("********************" & _
"割り算以外を計算します********************")
allfun = CType(System.Delegate.Remove(allfun, divfun), SimpleComputer)
val = CByte(ran.Next(1, 100))
val1 = CByte(ran.Next(1, 100))
Calculate(val, val1, allfun)
Console.WriteLine("")
End Sub
Shared Sub Main()
SingleExe()
MultiExe()
End Sub
End Class
Private Delegate Function SimpleComputer( _ ByVal val As Byte, ByVal val1 As Byte) As Double何かメソッドの定義みたいだね。と思った貴方は鋭い!。 デリゲートの宣言はメソッドの定義を決めるのに等しいピヨ。 このサンプルコードの場合は、Double型の値を返す、二つのByte型の値を受け取るメソッド を表しているんだ。これが何を意味するかは、これから解説するピヨ。
Calculate( val, val1, allfun )が一回しか呼んでいないピヨ。 でもちゃんと全部メソッドを呼んでいるよね。どう?不思議だよね。 これにはちゃんとしたトリックがあるんだ。そのトリックは、 Delegate.Invokeメソッドさ。 このメソッドが暗黙的に使用されて一つのデリゲート内に複数のメソッドを格納できるんだ。 だから一回呼べば全て呼ばれるんだ。これを応用すれば面白いソフトが作れるよ。色々妄想すると楽しいピヨ。 勿論、逆の処理も可能で、Delegate.Removeメソッドを使用すれば、 使用しなくなったメソッドを除外できよ。これも覚えておいてね。 じゃあこれでお終い!
#include "stdafx.h"
using namespace System;
ref class Program
{
private:
//デリゲートの宣言だピヨ
delegate Double SimpleComputer( Byte val, Byte val1 );
static Double Add( Byte val, Byte val1 ) {
Double rval = val + val1;
Console::Write( "{0}と{1}の足し算を行います。", val, val1 );
Console::Write( "答えは【{0}】です。\n", rval );
return rval;
}
static Double Subtract( Byte val, Byte val1 ) {
Double rval = val - val1;
Console::Write( "{0}と{1}の引き算を行います。", val, val1 );
Console::Write( "答えは【{0}】です。\n", rval );
return rval;
}
static Double Multiply( Byte val, Byte val1 ) {
Double rval = val * val1;
Console::Write( "{0}と{1}の掛け算を行います。", val, val1 );
Console::Write( "答えは【{0}】です。\n", rval );
return rval;
}
static Double Divide( Byte val, Byte val1 ) {
Double rval = (Double)val / (Double)val1;
Console::Write( "{0}と{1}の割り算を行います。", val, val1 );
Console::Write( "答えは【{0}】です。\n", rval );
return rval;
}
//ここでデリゲートを有効利用しているピヨ
static void Calculate( Byte val, Byte val1, SimpleComputer^ function ) {
if(function != nullptr) {
function( val, val1 );
}
}
public:
static void SingleExe( ) {
Console::WriteLine( "********************"
"一つずつメソッドを呼び出して計算します********************" );
Random^ ran = gcnew Random( ( Int32 ) DateTime::Now.Ticks );
Byte val = ( Byte ) ran->Next( 1, 100 );
Byte val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, gcnew SimpleComputer(&Program::Add) );
val = ( Byte ) ran->Next( 1, 100 );
val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, gcnew SimpleComputer(&Program::Subtract) );
val = ( Byte ) ran->Next( 1, 100 );
val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, gcnew SimpleComputer(&Program::Multiply) );
val = ( Byte ) ran->Next( 1, 100 );
val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, gcnew SimpleComputer(&Program::Divide) );
Console::WriteLine( "");
}
static void MultiExe( ) {
Console::WriteLine( "********************" +
"一度にメソッド呼び出して計算します********************" );
SimpleComputer^ add = gcnew SimpleComputer( Add );
SimpleComputer^ sub = gcnew SimpleComputer( Subtract );
SimpleComputer^ mul = gcnew SimpleComputer( Multiply );
SimpleComputer^ div = gcnew SimpleComputer( Divide );
SimpleComputer^ all = nullptr;
all = ( SimpleComputer^ ) Delegate::Combine( all, add );
all = ( SimpleComputer^ ) Delegate::Combine( all, sub );
all = ( SimpleComputer^ ) Delegate::Combine( all, mul );
all = ( SimpleComputer^ ) Delegate::Combine( all, div );
Random^ ran = gcnew Random( ( Byte ) DateTime::Now.Ticks );
Byte val = ( Byte ) ran->Next( 1, 100 );
Byte val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, all );
Console::WriteLine( "" );
Console::WriteLine( "********************" +
"割り算以外を計算します********************" );
all = ( SimpleComputer^ ) Delegate::Remove( all, div );
val = ( Byte ) ran->Next( 1, 100 );
val1 = ( Byte ) ran->Next( 1, 100 );
Calculate( val, val1, all );
Console::WriteLine( "" );
}
};
int main(array< System::String ^> ^args)
{
Program::SingleExe( );
Program::MultiExe( );
return 0;
}
delegate Double SimpleComputer( Byte val, Byte val1 );何かメソッドの定義みたいだね。と思った貴方は鋭い!。 デリゲートの宣言はメソッドの定義を決めるのに等しいピヨ。 このサンプルコードの場合は、Double型の値を返す、二つのByte型の値を受け取るメソッド を表しているんだ。これが何を意味するかは、これから解説するピヨ。
Calculate( val, val1, all );を一回しか呼んでいないピヨ。 でもちゃんと全部メソッドを呼んでいるよね。どう?不思議だよね。 これにはちゃんとしたトリックがあるんだ。そのトリックは、 Delegate.Invokeメソッドさ。 このメソッドは暗黙的に使用されてstrong>一つのデリゲート内に複数のメソッドを格納できるんだ。 だから一回呼べば全て呼ばれるんだ。これを応用すれば面白いソフトが作れるよ。色々妄想すると楽しいピヨ。 勿論、逆の処理も可能で、Delegate.Removeメソッドを使用すれば、 使用しなくなったメソッドを除外できよ。これも覚えておいてね。 じゃあこれでお終い!
class Program
{
//今回のキーポイント
private delegate double SimpleComputer( byte val, byte val1 );
private static double Add( byte val, byte val1 ) {
double rval = val + val1;
Console.Write( "{0}と{1}の足し算を行います。", val, val1 );
Console.Write( "答えは【{0}】です。\n", rval );
return rval;
}
private static double Subtract( byte val, byte val1 ) {
double rval = val - val1;
Console.Write( "{0}と{1}の引き算を行います。", val, val1 );
Console.Write( "答えは【{0}】です。\n", rval );
return rval;
}
private static double Multiply( byte val, byte val1 ) {
double rval = val * val1;
Console.Write( "{0}と{1}の掛け算を行います。", val, val1 );
Console.Write( "答えは【{0}】です。\n", rval );
return rval;
}
private static double Divide( byte val, byte val1 ) {
double rval = val / val1;
Console.Write( "{0}と{1}の割り算を行います。", val, val1 );
Console.Write( "答えは【{0}】です。\n", rval );
return rval;
}
//デリゲートを使用しているメソッド
private static void Calculate(
byte val, byte val1, SimpleComputer function )
{
if(function != null) {
function( val, val1 );
}
}
private static void SingleExe( ) {
Console.WriteLine( "********************" +
"一つずつメソッドを呼び出して計算します********************" );
Random ran = new Random( ( byte ) DateTime.Now.Ticks );
byte val = ( byte ) ran.Next( 1, 100 );
byte val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, Add );
val = ( byte ) ran.Next( 1, 100 );
val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, Subtract );
val = ( byte ) ran.Next( 1, 100 );
val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, Multiply );
val = ( byte ) ran.Next( 1, 100 );
val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, Divide );
Console.WriteLine( "");
}
private static void MultiExe( ) {
Console.WriteLine( "********************" +
"一度にメソッド呼び出して計算します********************" );
SimpleComputer add = new SimpleComputer( Add );
SimpleComputer sub = new SimpleComputer( Subtract );
SimpleComputer mul = new SimpleComputer( Multiply );
SimpleComputer div = new SimpleComputer( Divide );
SimpleComputer all = null;
all = ( SimpleComputer ) Delegate.Combine( all, add );
all = ( SimpleComputer ) Delegate.Combine( all, sub );
all = ( SimpleComputer ) Delegate.Combine( all, mul );
all = ( SimpleComputer ) Delegate.Combine( all, div );
Random ran = new Random( ( byte ) DateTime.Now.Ticks );
byte val = ( byte ) ran.Next( 1, 100 );
byte val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, all );
Console.WriteLine( "" );
Console.WriteLine( "********************" +
"割り算以外を計算します********************" );
all = ( SimpleComputer ) Delegate.Remove( all, div );
val = ( byte ) ran.Next( 1, 100 );
val1 = ( byte ) ran.Next( 1, 100 );
Calculate( val, val1, all );
Console.WriteLine( "" );
}
static void Main( string[ ] args ) {
SingleExe( );
MultiExe( );
}
}
private delegate double SimpleComputer( byte val, byte val1 );何かメソッドの定義みたいだね。と思った貴方は鋭い!。 デリゲートの宣言はメソッドの定義を決めるのに等しいピヨ。 このサンプルコードの場合は、double型の値を返す、二つのbyte型の値を受け取るメソッド を表しているんだ。これが何を意味するかは、これから解説するピヨ。
Calculate( val, val1, all );を一回しか呼んでいないピヨ。 でもちゃんと全部メソッドを呼んでいるよね。どう?不思議だよね。 これにはちゃんとしたトリックがあるんだ。そのトリックは、Delegate.Invokeメソッドさ。 このメソッドは暗黙的に使用されて 一つのデリゲート内に複数のメソッドを格納できるんだ。 だから一回呼べば全て呼ばれるんだ。これを応用すれば面白いソフトが作れるよ。色々妄想すると楽しいピヨ。 勿論、逆の処理も可能で、Delegate.Removeメソッドを使用すれば、 使用しなくなったメソッドを除外できよ。これも覚えておいてね。 じゃあこれでお終い!
Public Class MoveEventArgs
Inherits EventArgs 'ここに注目
'移動先
Private m_destination As String
Public Property Destination() As String
Get
Return m_destination
End Get
Set(ByVal value As String)
m_destination = value
End Set
End Property
'移動目的
Private m_purpose As String
Public Property Purpose() As String
Get
Return m_purpose
End Get
Set(ByVal value As String)
m_purpose = value
End Set
End Property
Sub New(ByVal destination As String, ByVal purpose As String)
Me.m_destination = destination
Me.m_purpose = purpose
End Sub
End Class
注目するべきところだけ抜粋
Public MustInherit Class Animal
'イベントの要素を定義
Public Event MoveEvent(ByVal sender As Object, ByVal e As MoveEventArgs)
'イベントの発生を通知するメソッド
Protected Sub OnMove(ByVal e As MoveEventArgs)
RaiseEvent MoveEvent(Me, e)
End Sub
'入力された値を正しいイベントに変換するメソッド
'※元からあるMoveメソッドを修正しました
Public Overridable Sub Move( _
ByVal destination As String, ByVal purpose As String)
Dim e As MoveEventArgs = New MoveEventArgs(destination, purpose)
OnMove(e)
End Sub
End Class
アクセス修飾子 Event イベントの名前 メソッドの定義VB.NETは説明が簡単で良い。じゃあ、次。
Public Class Bird
Inherits Animal
Public Sub New(ByVal name As String, ByVal age As Integer)
MyBase.New(name, age)
End Sub
Public Overrides Sub Move( _
ByVal destination As String, ByVal purpose As String)
Console.WriteLine("バサバサ飛ぶ")
MyBase.Move(destination, purpose)
End Sub
End Class
'新しく追加
Public Class Bear
Inherits Animal
Public Sub New(ByVal name As String, ByVal age As Integer)
MyBase.New(name, age)
End Sub
Public Overrides Sub Move( _
ByVal destination As String, ByVal purpose As String)
Console.WriteLine("のしのし歩く")
MyBase.Move(destination, purpose)
End Sub
End Class
Public Class Dog
Inherits Animal
Public Sub New(ByVal name As String, ByVal age As Integer)
MyBase.New(name, age)
End Sub
Public Overrides Sub Move( _
ByVal destination As String, ByVal purpose As String)
Console.WriteLine("タッタ走る")
MyBase.Move(destination, purpose)
End Sub
End Class
'変更した所だけ抜粋
Public Class Human
Public Overrides Sub Move( _
ByVal destination As String, ByVal purpose As String)
Console.WriteLine("テクテク歩く")
'人間は管理しないのでMyBaseを使わない
End Sub
Public Sub Management(ByRef target As Animal)
'AddHandlerでイベントとこのクラスを関連付けている
AddHandler target.MoveEvent, AddressOf Target_MoveEvent
End Sub
Private Sub Target_MoveEvent( _
ByVal sender As Object, ByVal e As MoveEventArgs)
Dim target As Animal = CType(sender, Animal)
If target.Name = "インドリ" Then
Console.WriteLine("{0}が逃亡するのを確認した。" & vbLf & _
"行き先:{1}" & vbLf & "目的:{2}" & vbLf, _
target.Name, e.Destination, e.Purpose)
Else
Console.WriteLine("「{0}さん」が移動するのを確認した。\n" _
& vbLf & "行き先:{1}" & vbLf & "目的:{2}" & vbLf, _
target.Name, e.Destination, e.Purpose)
End If
End Sub
End Class
Public Class Module1
Public Shared Sub Main()
Dim dre As Human = New Human("ドリィちゃん", 16)
dre.Talk()
dre.Move("わんくま動物園", "事務仕事")
Console.WriteLine("ドリィちゃんが事務仕事を始めます。")
Console.WriteLine("")
Dim tori As InDori = New InDori(29)
dre.Management(tori)
tori.Talk()
tori.Move("じゃんぬねっと", "遊び")
Dim naka As Bear = New Bear("中", 33)
dre.Management(naka)
naka.Talk()
naka.Move("東京", "勉強会")
Dim jyannnu As Dog = New Dog("じゃんぬ", 25)
dre.Management(jyannnu)
jyannnu.Talk()
jyannnu.Move("街", "スイーツ(笑)観察")
End Sub
End Class
何度かステップ実行して。そうすれば分かるはず。
私は気の聞いたこと言えないからこれでお終い。
そうそう。一つ言い忘れたわ。
public ref class MoveEventArgs : EventArgs //ここに注目
{
public :
//移動先
property String^ Destination;
//移動目的
property String^ Purpose;
MoveEventArgs( String^ destination, String^ purpose ) {
this->Destination = destination;
this->Purpose = purpose;
}
};
注目するべきところだけ抜粋
public ref class Animal abstract
{
public:
//2.イベントの要素を定義
delegate void MoveEventHandler(Object^ sender, MoveEventArgs^ e);
event MoveEventHandler^ MoveEvent;
//4.入力された値を正しいイベントに変換するメソッド
//※元からあるMoveメソッドを修正しました
virtual void Move(String^ destination, String^ purpose) {
MoveEventArgs^ e = gcnew MoveEventArgs( destination, purpose );
OnMove( e );
}
protected :
//3.イベントの発生を通知するメソッド
virtual void OnMove( MoveEventArgs^ e ) { MoveEvent(this, e); }
};
アクセス修飾子 event メソッドの定義 イベントの名前を定義すれば良い。メソッドの定義の部分は難しいけど、今のところは気にしない。 後でインドリが説明するから。じゃあ、次。
public ref class Bird : Animal
{
public:
Bird ( String^ name, Int32 age ) : Animal( name, age ) { }
virtual void Move( String^ destination, String^ purpose ) override {
Console::WriteLine( "バサバサ飛ぶ" );
Animal::Move( destination, purpose );
}
};
//新しく追加
public ref class Bear : Animal
{
public:
Bear ( String^ name, Int32 age ) : Animal( name, age ) { }
virtual void Move ( String^ destination, String^ purpose ) override {
Console::WriteLine( "のしのし歩く" );
Animal::Move( destination, purpose );
}
};
public ref class Dog : Animal
{
public:
Dog( String^ name, Int32 age ) : Animal( name, age ) { }
virtual void Move ( String^ destination, String^ purpose ) override {
Console::WriteLine( "タッタ走る" );
Animal::Move( destination, purpose );
}
};
//変更した所だけ抜粋
public ref class Human : Animal
{
public:
Human ( String^ name, Int32 age ) : Animal( name, age ) { }
virtual void Talk() override {
Console::WriteLine( "私は{0}。年は20だよ。", this->Name );
}
virtual void Move( String^ destination, String^ purpose ) override {
Console::WriteLine( "テクテク歩く" );
//人は管理しないからAnimal::Moveなし
}
void Management( Animal^ target ) {
target->MoveEvent +=
gcnew MoveEventHandler( this, &Human::Target_MoveEvent );
}
private :
void Target_MoveEvent( Object^ sender, MoveEventArgs^ e ) {
Animal^ target = ( Animal^ ) sender;
if ( target->Name == "インドリ" ) {
Console::WriteLine( "{0}が逃亡するのを確認した。\n" +
"行き先:{1}\n目的:{2}\n",
target->Name, e->Destination, e->Purpose );
} else {
Console::WriteLine( "「{0}さん」が移動するのを確認した。\n" +
"行き先:{1}\n目的:{2}\n",
target->Name, e->Destination, e->Purpose );
}
}
};
using namespace Sample;
int main(array< System::String ^> ^args)
{
Human^ dre = gcnew Human( "ドリィちゃん", 16 );
dre->Talk( );
dre->Move( "わんくま動物園", "事務仕事" );
Console::WriteLine( "ドリィちゃんが事務仕事を始めます。");
Console::WriteLine( "" );
InDori^ tori = gcnew InDori( 29 );
dre->Management( tori );
tori->Talk( );
tori->Move( "じゃんぬねっと", "遊び");
Bear^ naka = gcnew Bear( "中", 33 );
dre->Management( naka );
naka->Talk( );
naka->Move( "東京", "勉強会" );
Dog^ jyannnu = gcnew Dog( "じゃんぬ", 25 );
dre->Management( jyannnu );
jyannnu->Talk( );
jyannnu->Move( "街", "スイーツ(笑)観察");
return 0;
}
何度かステップ実行して。そうすれば分かるはず。
私は気の聞いたこと言えないからこれでお終い。
そうそう。一つ言い忘れたわ。
public class MoveEventArgs : EventArgs //ここに注目
{
//移動先
private string m_destination;
public string Destination {
get { return m_destination; }
set { m_destination = value; }
}
//移動目的
private string m_purpose;
public string Purpose {
get { return m_purpose; }
set { m_purpose = value; }
}
public MoveEventArgs( destination, string purpose ) {
this.MovingPerson = person;
this.m_destination = destination;
this.m_purpose = purpose;
}
}
注目するべきところだけ抜粋
public abstract class Animal
{
//イベントの要素を定義
public delegate void MoveEventHandler(object sender, MoveEventArgs e);
public event MoveEventHandler MoveEvent;
//イベントの発生を通知するメソッド
protected virtual void OnMove( MoveEventArgs e ) {
MoveEventHandler temp = MoveEvent;
if ( temp != null ) temp( this, e );
//入力された値を正しいイベントに変換するメソッド
//※元からあるMoveメソッドを修正しました
public virtual void Move( string destination, string purpose )
{
MoveEventArgs e = new MoveEventArgs( person, destination, purpose );
OnMove( e );
}
}
アクセス修飾子 event メソッドの定義 イベントの名前を定義すれば良い。メソッドの定義の部分は難しいけど、今のところは気にしない。 後でインドリが説明するから。じゃあ、次。
public class Bird : Animal
{
public Bird( string name, int age ) : base ( name, age ) { }
public override void Move( string destination, string purpose ) {
Console.WriteLine( "バサバサ飛ぶ" );
base.Move( destination, purpose );
}
}
//新しく追加
public class Bear : Animal
{
public Bear( string name, int age ) : base( name, age ) { }
public override void Move( string destination, string purpose ) {
Console.WriteLine( "のしのし歩く" );
base.Move( destination, purpose );
}
}
public class Dog : Animal
{
public Dog( string name, int age ) : base( name, age ) { }
public override void Move( string destination, string purpose ) {
Console.WriteLine( "タッタ走る" );
base.Move( destination, purpose );
}
}
//変更した所だけ抜粋
public class Human : Animal
{
public Human( string name, int age ) : base( name, age ) { }
public override void Talk( ) {
Console.WriteLine( "私は{0}。年は20だよ。", this.Name );
}
public override void Move( string destination, string purpose ) {
Console.WriteLine( "テクテク歩く" );
//人は管理しないからbase.Moveなし
}
public void Management( Animal target ) {
target.MoveEvent += new MoveEventHandler( Target_MoveEvent );
}
private void Target_MoveEvent( object sender, MoveEventArgs e ) {
Animal target = (Animal) sender;
if ( target.Name == "インドリ" ) {
Console.WriteLine( "{0}が逃亡するのを確認した。\n" +
"行き先:{1}\n目的:{2}\n",
target.Name, e.Destination, e.Purpose );
} else {
Console.WriteLine( "「{0}さん」が移動するのを確認した。\n" +
"行き先:{1}\n目的:{2}\n",
target.Name, e.Destination, e.Purpose );
}
}
}
class Program
{
static void Main( string[ ] args ) {
Human dre = new Human( "ドリィちゃん", 16 );
dre.Talk( );
dre.Move( "わんくま動物園", "事務仕事" );
Console.WriteLine( "ドリィちゃんが事務仕事を始めます。");
Console.WriteLine( "" );
InDori tori = new InDori( 29 );
dre.Management( tori );
tori.Talk( );
tori.Move( "じゃんぬねっと", "遊び");
Bear naka = new Bear( "中", 34 );
dre.Management( naka );
naka.Talk( );
naka.Move( "東京", "勉強会" );
Dog jyannnu = new Dog( "じゃんぬ", 26 );
dre.Management( jyannnu );
jyannnu.Talk( );
jyannnu.Move( "街", "スイーツ(笑)観察");
}
}
何度かステップ実行して。そうすれば分かるはず。
私は気の聞いたこと言えないからこれでお終い。
そうそう。一つ言い忘れたわ。