首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# --我如何拥有引用实现一组接口的任何对象的类型?

C# --我如何拥有引用实现一组接口的任何对象的类型?
EN

Stack Overflow用户
提问于 2011-11-13 22:18:06
回答 5查看 223关注 0票数 5

如何有一个类型引用来引用实现一组接口的任何对象?

例如,我可以具有如下的泛型类型:

Java:

代码语言:javascript
复制
public class Foo<T extends A & B> { }

C#

代码语言:javascript
复制
public class Foo<T> where T : A, B { }

这就是如何拥有一个类范围的泛型类型。但是,我只想拥有一个数据成员,它引用任何扩展给定接口集的对象。

示例:

代码语言:javascript
复制
public class Foo
{
    protected <? extends A, B> object;

    public void setObject(<? extends A, B> object)
    {
        this.object = object;
    }
}

如果有这种类型的语法是可能的,我怎样才能同时使用Java和C#呢?

我意识到我可以创建另一个接口来扩展所有想要的接口。但是,我并不认为这是最优的,因为它不必要地添加了另一种类型,其唯一目的是绕过语法。当然,这是一个很小的问题,但就优雅而言,这有点令人讨厌。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-14 01:10:17

在C#中,可以使用元组将值存储在某种中。

代码语言:javascript
复制
public class Foo {
  private Tuple<IA, IB> junction;
  public void SetValue<T>(T value) where T : IA, IB {
    junction = Tuple.Create<IA, IB>(value, value);
  }
}

还可以有一个特殊类来强制执行两个值都引用同一个对象的约束:

代码语言:javascript
复制
public class Junction {
  public IA A { get; private set; }
  public IB B { get; private set; }
  private Junction() { }
  public static Junction Create<T>(T value) where T: IA, IB {
    return new Junction {
      A = value,
      B = value
    };
  }
}

public class Foo {
  private Junction junction;
  public void SetValue<T>(T value) where T : IA, IB {
    junction = Junction.Create(value);
  }
}

在Java中,通配符可以简化一些事情

代码语言:javascript
复制
class Junction<E extends A & B> {
  private final E value;
  public Junction(E value) {
    this.value = value;
  }
  public E getValue() {
    return value;
  }
}

class Foo {
  private Junction<?> junction;
  public <E extends A & B> void setValue(E value) {
    junction = new Junction<E>(value);
  }
}

或者您可以有相同值的别名(C#,但也适用于Java):

代码语言:javascript
复制
public class Foo {
  private IA a;
  private IB b;
  public void SetValue<T>(T value) where T : IA, IB {
    a = value;
    b = value;
  }
}
票数 1
EN

Stack Overflow用户

发布于 2011-11-13 22:19:59

我的Java在长达两年的无活动状态下变得有点生疏了。

下面是我的C#方法:(完整的工作示例请参见https://ideone.com/N20xU )

代码语言:javascript
复制
public class Foo
{
    private IInterface1 _object; // just pick one

    public void setObject<T>(T obj)
        where T : IInterface1, IComparable<T>, IEtcetera
    {
        // you now *know* that object supports all the interfaces
        // you don't need the compiler to remind you
        _object = obj; 
    }

    public void ExerciseObject()
    { 
        // completely safe due to the constraints on setObject<T>
        IEtcetera itf = (IEtcetera) _object;

        // ....
    }
票数 4
EN

Stack Overflow用户

发布于 2011-11-13 22:30:40

据我所知,您不能创建带有约束的变量,只能创建给定类型的变量。类型具有约束。这意味着您必须定义一个具有所需约束的类型,然后使用该类型创建变量。

这在我看来是合乎逻辑的,我也不明白为什么你要为你需要的东西定义一个类型是“令人讨厌的”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8115191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档