29013


下記のコードのClassBaseのmethod()メソッドをstaticメソッドにしたいと考えています。もちろん、TestクラスのMain()メソッドの中もstaticメソッド呼び出しに変更しているとします。その場合、method()メソッド中のsub_method()メソッドもstaticメソッドにしなければなりませんが、sub_method()メソッドはabstractですので、エラーとなります。print()メソッドはまとめつつ、クラスに特化した部分のみ切り出す方法は他にありますでしょうか。

[code]

    using System;
    
    public abstract class ClassBase
    {
        public void method()
        {
            sub_method();
        }
    
        public abstract void sub_method();
    
        protected void print(string s) {
            System.Console.WriteLine("<<" + s + ">>");
        }
    }
    
    public class ClassA : ClassBase
    {
        public override void sub_method() {
            print("ClassA");
        }
    }
    
    public class ClassB : ClassBase
    {
        public override void sub_method() {
            print("ClassB");
        }
    }
    
    public class Test
    {
        public static void Main()
        {
            (new ClassA()).method();
    
            (new ClassB()).method();
        }
    }
    
[/code]


CC BY-SA 4.0
2016-09-21T01:05:39.650
29012
2020-04-27T09:45:52.807
2020-04-27T09:45:52.807
4236
18863
question
c#
static メソッドの中で abstract メソッドを呼びたい


`static`メソッドから呼び出し元で指定されている型によって分岐するような仕様は通常できません。

普通に`new ClassA().method()`と呼び出すのが一番シンプルだと思いますが、方法としてはシングルトン的にプロパティを公開するとか、

[code]

    class ClassA
    {
        public static ClassA Default { get; } = new ClassA();
    }
    // 使用イメージ
    // ClassA.Default.method();
    
[/code]

ジェネリック型引数を使用するか、

[code]

    class ClassBase
    {
        public static void Method<T>()
            where T: ClassBase, new()
            => new T().method();
    }
    // ClassBase.Method<ClassA>();
    
[/code]

各クラスに`static`メソッドを定義して内部でインスタンスメソッドを呼ぶこともできます。

[code]

    class ClassBase
    {
        // 質問文のmethodをprotectedに変更する
        protected void methodCore(); 
    }
    
    class ClassA
    {
        // 外部公開用
        public static void method() => new ClassA().MethodCore();
    }
    
[/code]


CC BY-SA 3.0
2016-09-21T01:29:49.753
29013
2016-09-21T01:29:49.753
5750
29012
answer