C#, implement 'static abstract' like methods

后端 未结 7 2084
一生所求
一生所求 2020-12-06 08:48

I recently ran into a problem where it seems I need a \'static abstract\' method. I know why it is impossible, but how can I work around this limitation?

For example

7条回答
  •  忘掉有多难
    2020-12-06 09:27

    A possible workaround is to define a Singleton of your derived class in your base class with the help of Generics.

    import System;
    
    public abstract class AbstractBase
        where T : AbstractBase, new()
    {
        private static T _instance = new T();
    
        public abstract string Description { get; }
        public static string GetDescription()
        {
            return _instance.Description;
        }
    }
    
    public class DerivedClass : AbstractBase
    {
        public override string Description => "This is the derived Class";
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DerivedClass.GetDescription());
            Console.ReadKey();
        }
    }
    

    The trick is to tell your AbstractBase some details about how DerivedClass is implemented:

    • It is newable with where T: new() so it can create a Singleton instance
    • It derives from itself with where T : AbstractBase so it knows that there will be a implementation of Description

    This way _instance contains the Description field which can be called in the static Method GetDescription(). This forces you to overwrite Descriptionin your DerivedClass and allows you to call its value with DerivedClass.GetDescription()

提交回复
热议问题