N286 Delegates (Terning / Action)
Du skal skabe en tom konsol app med en klasse Terning som følger:
class Terning
{
public int Værdi { get; private set; }
private Random random;
public void Ryst() {
Værdi = random.Next(1,7);
}
public void Skriv() {
Console.WriteLine($"[ {this.Værdi} ]");
}
public Terning()
{
this.Værdi = 1;
random = new Random();
}
}
Din opgave er at
- tilføje en (Action) delegate kaldet RystDelegate, som kan afvikle en eller flere void metoder med en int som argument der svarer til en rystet værdi. Metoderne skal afvikles når terningen rystes.
- tilføje en (Action) delegate kaldet SkrivDelegate, som kan afvikle en eller flere void metoder med en string som argument. Metoderne skal afvikles når Skriv-metoden kaldes. Terningen skal i konstruktøren tilføje Console.WriteLine som den metode Skriv-metoden kalder - men den kan overskrives af brugeren af klassen.
Herefter skal du prøve terningen godt af - eksempelvis med dette:
// Skriver terningen ud med Console.WriteLine?
Terning t0 = new Terning();
t0.Ryst();
t0.Skriv();
Console.WriteLine("----------");
// Afvikler terningen Rystet-metoden?
Terning t1 = new Terning();
t1.RystDelegate = Rystet;
t1.Ryst();
t1.Skriv();
Console.WriteLine("----------");
// Skriver terningen ud med Console.WriteLine og MinSkriv?
Terning t2 = new Terning();
t2.Ryst();
t2.SkrivDelegate += MinSkriv;
t2.Skriv();
void Rystet(int værdi) {
Console.WriteLine("Terningen er rystet til " + værdi);
}
void MinSkriv(string txt) {
File.WriteAllText(@"c:\temp\test.txt", txt);
}
Klik for at se et forslag til en løsning
class Terning
{
public int Værdi { get; private set; }
public Action<int> RystDelegate { get; set; }
public Action<string> SkrivDelegate { get; set; }
private Random random;
public void Ryst() {
Værdi = random.Next(1,7);
if (RystDelegate != null)
RystDelegate.Invoke(Værdi);
}
public void Skriv() {
if (SkrivDelegate != null)
SkrivDelegate.Invoke($"[ {this.Værdi} ]");
}
public Terning()
{
this.Værdi = 1;
random = new Random();
SkrivDelegate = Console.WriteLine;
}
}