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

Cod*_*nny 5 c# java syntax interface

我怎样才能有一个类型引用引用任何实现一组接口的对象?

例如,我可以有这样的泛型类型:

Java的:

public class Foo<T extends A & B> { }
Run Code Online (Sandbox Code Playgroud)

C#

public class Foo<T> where T : A, B { }
Run Code Online (Sandbox Code Playgroud)

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

例:

public class Foo
{
    protected <? extends A, B> object;

    public void setObject(<? extends A, B> object)
    {
        this.object = object;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有可能有这种类型的语法,我怎么能在Java和C#中做到这一点?


我意识到我可以创建另一个扩展所有所需接口的接口.但是,我不认为这是最优的,因为它不必要地添加另一种类型,其唯一目的是绕过语法.虽然这是一个非常小的问题,但就优雅而言,它有点令人痛苦.

Jor*_*dão 1

在 C# 中,您可以使用元组以一种叠加方式存储值:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以有一个专门的类来强制两个值引用同一对象的约束:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

在 Java 中,通配符会稍微简化一些事情:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Foo {
  private IA a;
  private IB b;
  public void SetValue<T>(T value) where T : IA, IB {
    a = value;
    b = value;
  }
}
Run Code Online (Sandbox Code Playgroud)