abstractとvirtualとoverrideとnewと。
なんなんだ、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と無印の違いを作る意味がわからん。
速度の問題みたいだけど、そんなことは意識したくないというか、むしろ速度を意識します的なキーワードを用意してくれ。