接口和类类型的变量引用

时间:2014-02-06 14:24:29

标签: c# inheritance interface

我正在从objective-c移植一些代码,并且他们有一个语法 SomeClass<SomeInterface> myVar = whatever;

这意味着该对象也处理该接口。 我试图在c#中弄清楚如何处理这个问题 有问题的函数必须返回SomeClass类型的对象,它也可以执行SomeInterface中定义的无关任务。

我现在能想到的唯一方法是创建一个模仿SomeClass并扩展SomeInterface的新界面。然而,这意味着为我遇到的每种功能组合添加一个新界面。

这是使这个有用的用例。 在我的例子中,SomeClass是一个可以从数据文件中自动填充其所有变量的类。所以这是一个非常通用的类。某些界面是它可以执行的一些特定功能。所以我要说的是你必须给我一个可以自动填充自己的课程,他的工作是XYZ(界面)

有什么建议吗?

编辑只是为了阐明您使用此编程模式的原因,这是一个易于理解的示例

Terminator class Cylon class

Interface HumanityDestroyer

Some Factory class - Terminator<HumanityDestroyer> BuildTerminator();

因此,在这个例子中,工厂正在整理两件不必相关的东西。并非所有终结者都是人道驱逐舰。然后我可以在其他地方使用相同的东西,但返回赛隆。我没有必要添加任何额外的接口来执行此操作,但可以在编译时确保它将执行这两项工作。

根据我对c#的评论,我只需要为“is”和“can-do”行为的每个“分组”设置单独的接口。

4 个答案:

答案 0 :(得分:2)

如果我理解你的问题,听起来你想要创建一个通用的SomeClass类,并对特定类型的接口有约束

public class SomeClass<T> where T: ISomeInterface
{
}

重新阅读你的问题之后,听起来你根本就不需要通用课程,听起来你想要的只是SomeClass实现ISomeInterface - 在C#中这是相对简单的去做。首先,定义接口

public interface ISomeInterface
{
    void Foo();
    Bar Bar();
}

然后定义要实现接口的类

public class SomeClass : ISomeInterface
{
    // SomeClass specific methods
    public void DoSomething()
    {
        ...
    }

    public void DoSomethingElse()
    {
        ...
    }

    // implement ISomeInterface methods

    public void Foo()
    {
        ...
    }

    public Bar Bar()
    {
        return ...;
    }
}

因此,假设whatever的类型为ISomeInterface且您知道它是SomeClass的实例,则您的作业需要直接投射

SomeClass myVar = (SomeClass)whatever;

或者您可以使用as运算符进行更安全的转换

SomeClass myVar = whatever as SomeClass;
if (myVar != null)
    // whatever was an instance of SomeClass

答案 1 :(得分:1)

在objectice c中,这个语法是 structual 映射; C#没有:您需要每种类型明确声明它们实现了接口,即

class SomeClass : SomeInterface
{
}

但是,纯粹用C#术语:

如果C#SomeClass类型隐式地(在公共接口上)实现SomeInterface,你可以直接使用这些方法,所以我认为它 subtype 实现接口,或者有一个显式接口实现(即非公共API)。在这种情况下,各种选择:

  • 两个变量:

    SomeClass myVar = whatever;
    SomeInterface myVarAsSomeInterface = (SomeInterface)whatever;
    

    然后只需访问myVarAsSomeInterface.Foo();

  • 之外的额外方法
  • 内联演员:

    ((SomeInterface)myVar).Foo();
    
  • 泛型和扩展方法:

    public static void Foo<T>(this T obj) where T : SomeClass, SomeInterface
    {
        obj.Foo(); // should resolve to SomeInterface.Foo
    }
    

    或者如果您不能假设接口,因为您在编译时不会知道子类型:

    public static void Foo(this SomeClass obj)
    {
        ((SomeInterface)obj).Foo();
    }
    

答案 2 :(得分:0)

变量的类型必须实现所有必需的接口并从正确的父类型继承。 C#仅支持从单个父类型继承,但您可以根据需要实现任意数量的接口。

考虑到这一点,你必须创建一个满足你需求的新类型。

答案 3 :(得分:0)

我可以想到两种方法来“......执行SomeInterface中定义的无关任务。”

您可以使用SomeInterface继承SomeClass,也可以使用Composition并使用SomeInterface作为SomeClass中的属性。