なんなんだ、C#は。
継承がよくわからん…キーワードはスーパークラス側にはabstract virtual、クライアントクラス側にはoverride newといろいろあるし。
とりあえず
class VirtualClass
{
public virtual String getName()
{
return "VirtualClass";
}
}
abstract class AbstractClass
{
public abstract String getName();
}
class StandardClass
{
public String getName()
{
return "StandardClass";
}
}
class VirtualConcreteClass : VirtualClass
{
public override String getName()
{
return "VirtualConcreteClass";
}
}
class AbstractConcreteClass : AbstractClass
{
public override String getName()
{
return "AbstractConcreteClass";
}
}
class StandardConcreteClass : StandardClass
{
public String getName()
{
return "StandardConcreteClass";
}
}
class NewStandardConcreteClass : StandardClass
{
public new String getName()
{
return "NewStandardConcreteClass";
}
}とかっていろいろ定義してみて、
VirtualClass vc = new VirtualClass();
VirtualConcreteClass vcc = new VirtualConcreteClass();
VirtualClass vcp = new VirtualConcreteClass();
Console.WriteLine("vc : " + vc.getName());
Console.WriteLine("vcc : " + vcc.getName());
Console.WriteLine("vcp : " + vcp.getName());
StandardClass sc = new StandardClass();
StandardConcreteClass scc = new StandardConcreteClass();
NewStandardConcreteClass scn = new NewStandardConcreteClass();
StandardClass scp = new StandardConcreteClass();
StandardClass scnp = new NewStandardConcreteClass();
Console.WriteLine("sc : " + sc.getName());
Console.WriteLine("scc : " + scc.getName());
Console.WriteLine("scn : " + scn.getName());
Console.WriteLine("scp : " + scp.getName());
Console.WriteLine("scnp : " + scnp.getName());
AbstractClass ac = new AbstractConcreteClass();
AbstractConcreteClass acc = new AbstractConcreteClass();
Console.WriteLine("ac : " + ac.getName());
Console.WriteLine("acc : " + acc.getName());と、実行してみた。結果
vc : VirtualClass //1 vcc : VirtualConcreteClass //2 vcp : VirtualConcreteClass //3 sc : StandardClass //4 scc : StandardConcreteClass //5 scn : NewStandardConcreteClass //6 scp : StandardClass //7 scnp : StandardClass //8 ac : AbstractConcreteClass //9 acc : AbstractConcreteClass //10
で、問題は45678のあたり。
スーパークラスにはvirtualが付いていないと、スーパークラスの型に入れても多態性が使えない。んなあほな。
virtualとabstractはまぁ、いいかなと思うけど、virtualと無印の違いを作る意味がわからん。
速度の問題みたいだけど、そんなことは意識したくないというか、むしろ速度を意識します的なキーワードを用意してくれ。