読者です 読者をやめる 読者になる 読者になる

Paradigm Shift Design

ISHITOYA Kentaro's blog.

abstractとvirtualとoverrideとnewと。

C#

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


んー、というかJavaみたいに多態性命みたいなコードを書くなってことなのか。