1

我为 fluent API 的扩展方法提供了三个标记接口:

interface IOne { }
interface ITwo { }
interface IOneOrTwo : IOne, ITwo { }

以及以下扩展方法:

public static IOneOrTwo Foo (this IOne obj, string arg)
{
    // do something with arg
    return obj; // <- possible without cast?
}

问题:是否有可能在不强制转换的情况下返回 obj ?通常,在这种情况下您需要显式地向下转换,但是,这些接口都不需要底层对象具有任何类型的方法/属性/任何东西。

注意:实际的实现类实现了所有的接口。

问题 2:为什么正在实施IOneITwo不是自动让实施也属于类型IOneOrTwo

4

2 回答 2

6

看起来您的实施可能是落后的,并且可能会回答您要拥有IOneITwo实施IOneOrTwo的两个问题,而不是相反。

interface IOneOrTwo { }
interface IOne: IOneOrTwo { }
interface ITwo: IOneOrTwo { }

//*** This should now work fine ***
public static IOneOrTwo Foo (this IOne obj, string arg)
{
    // do something with arg
    return obj;     
}

澄清:

//This extension method is available to IOne, ITwo, and IOneOrTwo
public static IOneOrTwo Foo2 (this IOneOrTwo obj, string arg)
{
    // do something with arg
    return obj:
}

//This extension method is available only to IOne
public static IOne Foo2 (this IOne obj, string arg)
{
    // do something with arg
    return obj:
}

//This extension method is available only to ITwo
public static ITwo Foo2 (this ITwo obj, string arg)
{
    // do something with arg
    return obj:
}
于 2013-07-24T18:15:53.067 回答
1

是否有可能在不强制转换的情况下返回 obj ?

不,仅仅因为一个类实现了IOne并不意味着它也实现了IOneOrTwo。所以你需要投(很可能会失败)

这些接口都不需要底层对象具有任何类型的方法/属性/任何东西。

那是无关紧要的。缺乏实际方法并不会神奇地让你失望。如果一个对象 implements IOne,从技术上讲,它可以在不添加任何方法的情况下实现IOneOrTwo,但它仍然需要在类定义中显式包含它。

为什么正在实施IOneITwo不是自动让实施也属于类型IOneOrTwo

因为IOneOrTwo 可能包括不属于IOneor的方法ITwo。仅仅因为一个对象实现了IOne并不ITwo意味着它也实现了任何包含这两个的接口。

可以使用泛型得到你想要的:

public static T Foo<T> (this T obj, string arg) where T: IOne
{
    // do something with arg
    return obj; 
}

那么你可以说:

IOneOrTwo obj = new IOneOrTwoImpl();
IOneOrTwo obj2 = obj.Foo("gfgfd");  // valid since obj implements IOneOrTwo

但你不能这样做:

IOne obj = new IOneImpl();
IOneOrTwo obj2 = obj.Foo("gfgfd");  // not valid since obj does not implement IOneOrTwo

没有演员表。

底线 - 接口实现必须显式声明。仅仅因为一个类可以实现一个接口(意味着它包含构成该接口的所有方法/属性)并不意味着您可以将其视为实现了该接口。

于 2013-07-24T18:43:45.020 回答