C#, implement 'static abstract' like metho

2019-01-15 04:54发布

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 I have an abstract class which has a description string. Since this string is common for all instances, it is marked as static, but I want to require that all classes derived from this class provide their own Description property so I marked it as abstract:

abstract class AbstractBase
{
    ...
    public static abstract string Description{get;}
    ...
}

It won't compile of course. I thought of using interfaces but interfaces may not contain static method signatures.

Should I make it simply non-static, and always get an instance to get that class specific information?

Any ideas?

7条回答
Bombasti
2楼-- · 2019-01-15 05:54

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<T>
    where T : AbstractBase<T>, new()
{
    private static T _instance = new T();

    public abstract string Description { get; }
    public static string GetDescription()
    {
        return _instance.Description;
    }
}

public class DerivedClass : AbstractBase<DerivedClass>
{
    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<T> 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<T> 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()

查看更多
登录 后发表回答