【问题标题】:C# anonymously implement interface (or abstract class) [duplicate]C#匿名实现接口(或抽象类)[重复]
【发布时间】:2012-01-20 12:34:00
【问题描述】:

在 Java 中,可以使用可以动态实现的匿名类来扩展接口。示例:

Runnable myRunnable = new Runnable()
{
    @Override
    public void run() { /**/ }
}

(更多信息:http://www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO

这在 C# 中可行吗?如果不是,有哪些可行的替代方案而不必依赖实现过多的子类?

【问题讨论】:

    标签: c# anonymous-types


    【解决方案1】:

    不,您不能在 C# 中这样做 - 但通常替代设计方法是使用委托代替。在您给出的示例中,Runnable 通常使用 ThreadStart 表示,您可以使用匿名方法或 lambda 表达式:

    ThreadStart start = () =>
    {
        // Do stuff here
    };
    

    或者,如果您只有一个方法可以运行,并且具有正确的签名,您可以使用方法组转换:

    ThreadStart start = MethodToRunInThread;
    

    或者在Thread构造函数中调用:

    Thread t = new Thread(MethodToRunInThread);
    t.Start();
    

    如果您真的需要实现一个接口,那么您必须真正实现它(可能在私有嵌套类中)。然而,根据我的经验,这在 C# 中并不经常出现 - 通常 C# 接口是自然需要“真正”实现的那种接口,即使在 Java 中也是如此。

    【讨论】:

    • 这是我时常怀念的一个功能,尤其是因为我的接口通常很窄(角色接口)并且遵守接口隔离原则。当我可以在我的 DI 配置中注册一个委托时会很方便,而应用程序的其余部分仍然可以依赖于该接口(而不是 Func<T>),而不必创建某种包装该委托的代理类和实现该接口。
    【解决方案2】:

    正如 Jon 指出的,这在 C# 中是不可能的。

    不过,C# 中的另一种模式是使用工厂和委托的组合来允许动态实现接口。本质上,工厂为接口的每个方法接收一个委托,并将它们用作支持实现。例如,这是IComparable<T> 的版本。

    public static class ComparableFactory {
      private sealed ComparableImpl<T> : IComparable<T> {
        internal Func<T, T, int> _compareFunc;
        public int Compare(T left, T right) {
          return _compareFunc(left, right);
        }
      }
      public IComparable<T> Create<T>(Func<T, T, int> compareFunc) {
        return new ComparableImpl<T>() { _compareFunc = compareFunc };
      }
    }
    
    ...
    
    IComparable<Person> impl = CompareableFactory.Create<Person>(
      (left, right) => left.Age.CompareTo(right.Age));
    

    【讨论】:

    • 非常酷,+1!但作为一个好的做法,最好只滚动命名类..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多