K
Karsten Schramm
Hi,
I tried to show someone the general idea of shadowing.
Then in my last step I stumbled.
This is the original code that worked exactly as expected:
-----
using System;
using System.Collections.Generic;
namespace VirtualOverride
{
class Program
{
static void Main()
{
Alarm alarm = new Alarm(5);
Console.WriteLine(alarm.GetDisplayClass());
Console.WriteLine(alarm.GetSomething());
TypeAlarm typeAlarm = new TypeAlarm(12);
typeAlarm.Name = "Test";
Console.WriteLine(typeAlarm.GetDisplayClass());
Console.WriteLine(typeAlarm.GetSomething());
InstanceAlarm instanceAlarm = new InstanceAlarm(17, typeAlarm);
Console.WriteLine(instanceAlarm.GetDisplayClass());
Console.WriteLine(instanceAlarm.GetSomething());
InstanceAlarm instanceAlarm2 = new InstanceAlarm(typeAlarm);
Console.WriteLine(instanceAlarm2.GetDisplayClass());
Console.WriteLine(instanceAlarm2.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<Alarm> alarms = new List<Alarm>(4);
alarms.Add(alarm);
alarms.Add(typeAlarm);
alarms.Add(instanceAlarm);
alarms.Add(instanceAlarm2);
foreach (Alarm alarmIterator in alarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.WriteLine();
Console.WriteLine();
Alarm instanceAlarm3a = new InstanceAlarm(47, typeAlarm);
Console.WriteLine(instanceAlarm3a.GetDisplayClass());
Console.WriteLine(instanceAlarm3a.GetSomething());
InstanceAlarm instanceAlarm3b = (InstanceAlarm)instanceAlarm3a;
Console.WriteLine(instanceAlarm3b.GetDisplayClass());
Console.WriteLine(instanceAlarm3b.GetSomething());
Console.ReadLine();
}
}
interface IAlarm
{
Int32 GetDisplayClass();
String GetSomething();
}
interface ITypeAlarm : IAlarm
{
}
class Alarm : IAlarm
{
private Int32 m_DisplayClass;
public Alarm(Int32 displayClass)
{
this.m_DisplayClass = displayClass;
}
public virtual Int32 GetDisplayClass()
{
return (this.m_DisplayClass);
}
public String GetSomething()
{
return ("This is an Alarm");
}
}
class TypeAlarm : Alarm, ITypeAlarm
{
public String Name;
public TypeAlarm(Int32 displayClass)
: base(displayClass)
{
}
public override Int32 GetDisplayClass()
{
return (base.GetDisplayClass());
}
public new String GetSomething()
{
return ("This is a TypeAlarm");
}
}
class InstanceAlarm : Alarm
{
private TypeAlarm m_TypeAlarm;
public InstanceAlarm(Int32 displayClass, TypeAlarm typeAlarm)
: base(displayClass)
{
this.m_TypeAlarm = typeAlarm;
}
public InstanceAlarm(TypeAlarm typeAlarm)
: this(-1, typeAlarm)
{
}
public override Int32 GetDisplayClass()
{
Int32 displayClass;
displayClass = base.GetDisplayClass();
if (displayClass == -1)
{
return (this.m_TypeAlarm.GetDisplayClass());
}
else
{
return (displayClass);
}
}
public override String ToString()
{
return (String.Format("InstanceAlarm of TypeAlarm '{0}'", this.m_TypeAlarm.Name));
}
public new String GetSomething()
{
return ("This is an InstanceAlarm");
}
}
}
-----
No I moved the GetSomething() method to the interface IAlarm and built a second iterator:
-----
using System;
using System.Collections.Generic;
namespace VirtualOverride
{
class Program
{
static void Main()
{
Alarm alarm = new Alarm(5);
Console.WriteLine(alarm.GetDisplayClass());
Console.WriteLine(alarm.GetSomething());
TypeAlarm typeAlarm = new TypeAlarm(12);
typeAlarm.Name = "Test";
Console.WriteLine(typeAlarm.GetDisplayClass());
Console.WriteLine(typeAlarm.GetSomething());
InstanceAlarm instanceAlarm = new InstanceAlarm(17, typeAlarm);
Console.WriteLine(instanceAlarm.GetDisplayClass());
Console.WriteLine(instanceAlarm.GetSomething());
InstanceAlarm instanceAlarm2 = new InstanceAlarm(typeAlarm);
Console.WriteLine(instanceAlarm2.GetDisplayClass());
Console.WriteLine(instanceAlarm2.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<Alarm> alarms = new List<Alarm>(4);
alarms.Add(alarm);
alarms.Add(typeAlarm);
alarms.Add(instanceAlarm);
alarms.Add(instanceAlarm2);
foreach (Alarm alarmIterator in alarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.WriteLine();
Console.WriteLine();
Alarm instanceAlarm3a = new InstanceAlarm(47, typeAlarm);
Console.WriteLine(instanceAlarm3a.GetDisplayClass());
Console.WriteLine(instanceAlarm3a.GetSomething());
InstanceAlarm instanceAlarm3b = (InstanceAlarm)instanceAlarm3a;
Console.WriteLine(instanceAlarm3b.GetDisplayClass());
Console.WriteLine(instanceAlarm3b.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<IAlarm> ialarms = new List<IAlarm>(4);
ialarms.Add(alarm);
ialarms.Add(typeAlarm);
ialarms.Add(instanceAlarm);
ialarms.Add(instanceAlarm2);
foreach (IAlarm alarmIterator in ialarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.ReadLine();
}
}
interface IAlarm
{
Int32 GetDisplayClass();
String GetSomething();
}
interface ITypeAlarm : IAlarm
{
}
class Alarm : IAlarm
{
private Int32 m_DisplayClass;
public Alarm(Int32 displayClass)
{
this.m_DisplayClass = displayClass;
}
public virtual Int32 GetDisplayClass()
{
return (this.m_DisplayClass);
}
public String GetSomething()
{
return ("This is an Alarm");
}
}
class TypeAlarm : Alarm, ITypeAlarm
{
public String Name;
public TypeAlarm(Int32 displayClass)
: base(displayClass)
{
}
public override Int32 GetDisplayClass()
{
return (base.GetDisplayClass());
}
public new String GetSomething()
{
return ("This is a TypeAlarm");
}
}
class InstanceAlarm : Alarm
{
private TypeAlarm m_TypeAlarm;
public InstanceAlarm(Int32 displayClass, TypeAlarm typeAlarm)
: base(displayClass)
{
this.m_TypeAlarm = typeAlarm;
}
public InstanceAlarm(TypeAlarm typeAlarm)
: this(-1, typeAlarm)
{
}
public override Int32 GetDisplayClass()
{
Int32 displayClass;
displayClass = base.GetDisplayClass();
if (displayClass == -1)
{
return (this.m_TypeAlarm.GetDisplayClass());
}
else
{
return (displayClass);
}
}
public override String ToString()
{
return (String.Format("InstanceAlarm of TypeAlarm '{0}'", this.m_TypeAlarm.Name));
}
public new String GetSomething()
{
return ("This is an InstanceAlarm");
}
}
}
-----
The result of that last iteration returns:
-----
5
This is an Alarm
12
This is a TypeAlarm
17
This is an Alarm
12
This is an Alarm
I tried to show someone the general idea of shadowing.
Then in my last step I stumbled.
This is the original code that worked exactly as expected:
-----
using System;
using System.Collections.Generic;
namespace VirtualOverride
{
class Program
{
static void Main()
{
Alarm alarm = new Alarm(5);
Console.WriteLine(alarm.GetDisplayClass());
Console.WriteLine(alarm.GetSomething());
TypeAlarm typeAlarm = new TypeAlarm(12);
typeAlarm.Name = "Test";
Console.WriteLine(typeAlarm.GetDisplayClass());
Console.WriteLine(typeAlarm.GetSomething());
InstanceAlarm instanceAlarm = new InstanceAlarm(17, typeAlarm);
Console.WriteLine(instanceAlarm.GetDisplayClass());
Console.WriteLine(instanceAlarm.GetSomething());
InstanceAlarm instanceAlarm2 = new InstanceAlarm(typeAlarm);
Console.WriteLine(instanceAlarm2.GetDisplayClass());
Console.WriteLine(instanceAlarm2.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<Alarm> alarms = new List<Alarm>(4);
alarms.Add(alarm);
alarms.Add(typeAlarm);
alarms.Add(instanceAlarm);
alarms.Add(instanceAlarm2);
foreach (Alarm alarmIterator in alarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.WriteLine();
Console.WriteLine();
Alarm instanceAlarm3a = new InstanceAlarm(47, typeAlarm);
Console.WriteLine(instanceAlarm3a.GetDisplayClass());
Console.WriteLine(instanceAlarm3a.GetSomething());
InstanceAlarm instanceAlarm3b = (InstanceAlarm)instanceAlarm3a;
Console.WriteLine(instanceAlarm3b.GetDisplayClass());
Console.WriteLine(instanceAlarm3b.GetSomething());
Console.ReadLine();
}
}
interface IAlarm
{
Int32 GetDisplayClass();
String GetSomething();
}
interface ITypeAlarm : IAlarm
{
}
class Alarm : IAlarm
{
private Int32 m_DisplayClass;
public Alarm(Int32 displayClass)
{
this.m_DisplayClass = displayClass;
}
public virtual Int32 GetDisplayClass()
{
return (this.m_DisplayClass);
}
public String GetSomething()
{
return ("This is an Alarm");
}
}
class TypeAlarm : Alarm, ITypeAlarm
{
public String Name;
public TypeAlarm(Int32 displayClass)
: base(displayClass)
{
}
public override Int32 GetDisplayClass()
{
return (base.GetDisplayClass());
}
public new String GetSomething()
{
return ("This is a TypeAlarm");
}
}
class InstanceAlarm : Alarm
{
private TypeAlarm m_TypeAlarm;
public InstanceAlarm(Int32 displayClass, TypeAlarm typeAlarm)
: base(displayClass)
{
this.m_TypeAlarm = typeAlarm;
}
public InstanceAlarm(TypeAlarm typeAlarm)
: this(-1, typeAlarm)
{
}
public override Int32 GetDisplayClass()
{
Int32 displayClass;
displayClass = base.GetDisplayClass();
if (displayClass == -1)
{
return (this.m_TypeAlarm.GetDisplayClass());
}
else
{
return (displayClass);
}
}
public override String ToString()
{
return (String.Format("InstanceAlarm of TypeAlarm '{0}'", this.m_TypeAlarm.Name));
}
public new String GetSomething()
{
return ("This is an InstanceAlarm");
}
}
}
-----
No I moved the GetSomething() method to the interface IAlarm and built a second iterator:
-----
using System;
using System.Collections.Generic;
namespace VirtualOverride
{
class Program
{
static void Main()
{
Alarm alarm = new Alarm(5);
Console.WriteLine(alarm.GetDisplayClass());
Console.WriteLine(alarm.GetSomething());
TypeAlarm typeAlarm = new TypeAlarm(12);
typeAlarm.Name = "Test";
Console.WriteLine(typeAlarm.GetDisplayClass());
Console.WriteLine(typeAlarm.GetSomething());
InstanceAlarm instanceAlarm = new InstanceAlarm(17, typeAlarm);
Console.WriteLine(instanceAlarm.GetDisplayClass());
Console.WriteLine(instanceAlarm.GetSomething());
InstanceAlarm instanceAlarm2 = new InstanceAlarm(typeAlarm);
Console.WriteLine(instanceAlarm2.GetDisplayClass());
Console.WriteLine(instanceAlarm2.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<Alarm> alarms = new List<Alarm>(4);
alarms.Add(alarm);
alarms.Add(typeAlarm);
alarms.Add(instanceAlarm);
alarms.Add(instanceAlarm2);
foreach (Alarm alarmIterator in alarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.WriteLine();
Console.WriteLine();
Alarm instanceAlarm3a = new InstanceAlarm(47, typeAlarm);
Console.WriteLine(instanceAlarm3a.GetDisplayClass());
Console.WriteLine(instanceAlarm3a.GetSomething());
InstanceAlarm instanceAlarm3b = (InstanceAlarm)instanceAlarm3a;
Console.WriteLine(instanceAlarm3b.GetDisplayClass());
Console.WriteLine(instanceAlarm3b.GetSomething());
Console.WriteLine();
Console.WriteLine();
List<IAlarm> ialarms = new List<IAlarm>(4);
ialarms.Add(alarm);
ialarms.Add(typeAlarm);
ialarms.Add(instanceAlarm);
ialarms.Add(instanceAlarm2);
foreach (IAlarm alarmIterator in ialarms)
{
Console.WriteLine(alarmIterator.GetDisplayClass());
Console.WriteLine(alarmIterator.GetSomething());
}
Console.ReadLine();
}
}
interface IAlarm
{
Int32 GetDisplayClass();
String GetSomething();
}
interface ITypeAlarm : IAlarm
{
}
class Alarm : IAlarm
{
private Int32 m_DisplayClass;
public Alarm(Int32 displayClass)
{
this.m_DisplayClass = displayClass;
}
public virtual Int32 GetDisplayClass()
{
return (this.m_DisplayClass);
}
public String GetSomething()
{
return ("This is an Alarm");
}
}
class TypeAlarm : Alarm, ITypeAlarm
{
public String Name;
public TypeAlarm(Int32 displayClass)
: base(displayClass)
{
}
public override Int32 GetDisplayClass()
{
return (base.GetDisplayClass());
}
public new String GetSomething()
{
return ("This is a TypeAlarm");
}
}
class InstanceAlarm : Alarm
{
private TypeAlarm m_TypeAlarm;
public InstanceAlarm(Int32 displayClass, TypeAlarm typeAlarm)
: base(displayClass)
{
this.m_TypeAlarm = typeAlarm;
}
public InstanceAlarm(TypeAlarm typeAlarm)
: this(-1, typeAlarm)
{
}
public override Int32 GetDisplayClass()
{
Int32 displayClass;
displayClass = base.GetDisplayClass();
if (displayClass == -1)
{
return (this.m_TypeAlarm.GetDisplayClass());
}
else
{
return (displayClass);
}
}
public override String ToString()
{
return (String.Format("InstanceAlarm of TypeAlarm '{0}'", this.m_TypeAlarm.Name));
}
public new String GetSomething()
{
return ("This is an InstanceAlarm");
}
}
}
-----
The result of that last iteration returns:
-----
5
This is an Alarm
12
This is a TypeAlarm
17
This is an Alarm
12
This is an Alarm