1

一般规则是我想说,“T 有一个带有 String 参数的方法,它将返回 List。” 详细地说,我们可以调用接口 ICanCreateListOfObjectsFromString。一个可能的应用可能是搜索。

感觉在我的界面中有一个静态方法会很好,但我知道这在 C# 中是不允许的。在类上指定这种合同实现的另一种方法是什么?

编辑:我想要以下代码:

public interface ISearch
{
    static List<T> Search<T>(String s);
}

public class MyObject : ISearch {
    List<MyObject> Search(string s) {
        //...
    }
}

public List<T> DoFooSearch<T:ISearch> () {
        return T.Search("Foo");
}

public List<T> DoBarSearch<T:ISearch> () {
        return T.Search("Bar");
}

您可能会看到为什么这段代码无法编译,但它表达了我想要实现的精神。我希望这能澄清我的意图。

4

3 回答 3

1

听起来您正在尝试实现一个 Mixin... 这种东西存在于 C# 3.0 中,它们被命名为“扩展方法”。

允许你做什么?好吧,它们允许您创建以您指定的类型工作的函数,并向它们“添加”方法。由于该类型可以是接口,因此您可以为接口定义具体函数。

诚然,这些函数不是接口代码本身的一部分,但它们也不是任何接口实现的一部分。所以这是一个“杯子半满”的场景。

(一个简短的搜索让我找到了使用 C# 扩展方法实现 Mixins。)

或者:如果您不需要对实现接口的类进行多重继承,则可以使用抽象类而不是接口,并直接在其中实现具体功能。但是话又说回来,这意味着您放弃从该类以外的任何东西继承(并实现其他接口。)

于 2009-01-14T07:00:31.687 回答
0

也许工厂模式就是您正在寻找的。

于 2009-01-13T23:17:54.617 回答
0

第一个选项是将两个问题分开:

  • 一种类型是实体
  • 一种是工厂

然后你可以为工厂创建一个接口,并使用它(基本上就像实体上以前的静态方法一样)。

另一种选择是在代表中交谈 - 即 a Func<string,List<...>>(对于某些列表类型);然后你可以简单地创建一个委托:

Func<string,List<...>> func = SomeType.SomeMethod; // static method

然后您可以传递func,并(稍后)将其用作:

List<...> data = func("abc");
于 2009-01-13T23:18:46.173 回答