gpt4 book ai didi

c# - 替代接口(interface)的静态方法

转载 作者:行者123 更新时间:2023-12-03 23:18:04 26 4
gpt4 key购买 nike

我知道静态方法对于接口(interface)是不正确的(参见:Why Doesn't C# Allow Static Methods to Implement an Interface?)但是遇到了这样一种情况,即我有一个对象实现了接口(interface)的所有方法,其中所有方法都可以是静态的,所以我认为我一定是设计不正确.

麻烦的是,我看不到任何替代方案

我的界面IDataSerializer由几个类实现。一个反序列化 XML,一个执行 JSON,等等。所有这些类都实现相同的功能,并且没有任何“状态数据”(成员等),但最终都会导致输出相同类型的对象。

例如,XML 类:

public class MyXmlSerializer : IDataSerializer
{
public string SerializeFoo(object foo)
{
// uses .Net XML serialzer to serialize foo
}

public object DeserializeFoo(string foo)
{
// uses .NET XML serializer to deserialize foo
}

// Object type returned by above methods is only ever
// used by following method which returns a type available
// to all IDataSerializer implementations as this is
// the data actually used by the rest of the program

public IList<Bar> CreateBarList(object deserializedFoo)
{
// does some magic to extract a list of Bar from the
// deserialized data, this is the main work for any
// IDataSerializer implementation
}
}

显然,上面显示的所有方法都可以是静态的(它们都将所需的所有信息作为参数接收,并且都返回它们的工作结果,没有成员或字段)......但是因为它们应该在序列化程序中实现可以适用于任何类型的串行数据(XML、JSON、YAML 等)然后它们形成一个接口(interface)......它是哪个?我想错了吗?是否有替代的、特定的模式来实现我想做的事情?

事后思考 :也许我应该简单地改变我的反序列化工作的想法,将每个实现视为序列化器,从而建议用抽象类替换接口(interface)?

事后诸葛亮 : 被覆盖的方法也不能是静态的,因此更改为抽象类也无济于事。

最佳答案

从逻辑的角度来看,这些方法应该是静态的,因为它们在逻辑上不适用于特定实例并且不使用共享资源。这个类也没有状态。但是……从务实的角度来看,即时类带来了很多好处,比如:

  • 类(接口(interface))如果完全可测试,
  • 关注 OOP和坚实的原则,
  • 可以注册为单例,因此您只能创建此对象的一个​​实例,
  • 向这些类添加任何依赖项很容易
  • 易于维护
  • 可以应用一些有用的设计模式(例如装饰器、复合)
  • 可以随时延迟加载和处置

  • 在您的情况下,我认为您应该将此实现隐藏在接口(interface)后面并将其注册为 singleton ,例如(使用 autofac )
    builder.RegisterType<MyXmlSerializer>().As<IDataSerializer>().SingleInstance();

    另外,如果需要,可以为这个接口(interface)创建一个扩展方法,给这个合约添加静态方法。

    更多信息可以在这里找到:
  • Instance methods vs static
  • Static class vs singleton
  • Extension methods
  • 关于c# - 替代接口(interface)的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45322127/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com