繁体   English   中英

C#静态接口或抽象实现

[英]C# static interface or abstract implementation

我有一个程序,需要能够与多个平台接口,即读/写文件,读/写数据库或读/写Web请求。 平台界面从配置中选择,在应用程序运行时不会更改。 我有一个读/写接口类,它由平台特定的类继承,以便从程序的其余部分中抽象出来。

我的问题是我的框架中有10个类需要使用这个接口。 我认为将接口设置为静态是有意义的,而不是创建这个类的多个实例,或者将单个引用传递给每个类。 不幸的是我刚刚了解到Interfaces不能有静态方法,静态方法不能调用非静态方法而静态方法不能抽象。

任何人都可以告诉我另一种接近这种情况的方法吗?

编辑:感谢大家的意见,这是基于Patrick Hofman给出的例子的解决方案(谢谢!)

interface TheInterface
{
    void read();
    void write();
}


public class X : TheInterface
{
    public void read() { //do something }
    public void write() { //do something }
}

public class Y : TheInterface
{
    public void read() { //do something }
    public void write() { //do something }
}


public class FileAccessor
{
    public static TheInterface accessor;

    public static TheInterface Accessor
    {
        get
        {
            if(accessor) return accessor;
        }
    }
}

这可以被任何类调用为:

static void Main(string[] args)
{
    switch (Config.interface)
    {
        case "X":
            FileAccessor.accessor = new Lazy<X>();
        case "Y":
            FileAccessor.accessor = new Lazy<Y>();
        default:
            throw new Lazy<Exception>("Unknown interface: " + Config.interface);
    }

    FileAccessor.Accessor.read();
}

实际上,接口或抽象类本身不能是static ,但进一步的实现可以。 此外,您可以使用单例模式使您的生活更轻松,并允许继承等。

public class X : ISomeInterface
{
    private X() { }

    public static X instance;
    public static X Instance
    {
        get
        {
            return instance ?? (instance = new X());
        }
    }
}

或者,使用Lazy<T>

public class X : ISomeInterface
{
    private X() { }

    public static Lazy<X> instanceLazy = new Lazy<X>(() => new X());
    public static X Instance
    {
        get
        {
            return instance.Value;
        }
    }
}

免责声明:我是下面描述的图书馆的作者。

我不知道这是否对你有所帮助,但我编写了一个库 (很早版本),它允许你定义静态接口,定义普通接口并用名为[Static]的属性装饰它们的方法,例如:

public interface IYourInterface
{
    [Static] 
    void DoTheThing();
}

(请注意,您没有将此接口显式添加到您的实现中。)

一旦定义了接口,就可以使用您选择的任何有效实现从代码中实例化它:

return typeof(YourImplementation).ToStaticContract<IYourInterface>();

如果在YourImplementation找不到这些方法,则此调用在运行时会失败并出现异常。

如果找到方法并且此调用成功,则客户端代码可以多态调用您的静态方法,如下所示:

IYourInterface proxy = GetAnImplementation();
proxy.DoTheThing();

您可以创建一个具有接口变量的静态类。

  public static class StaticClass
  {
    public static ISomeInterface Interface;
  }

现在,您可以从Framwork中的任何位置访问实例

static void Main(string[] args)
{
  StaticClass.Interface = new SomeClass();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM