【问题标题】:Define class constraint on interface or variable在接口或变量上定义类约束
【发布时间】:2017-03-22 15:35:51
【问题描述】:

我有一种情况,我需要一个变量是某种类型,但它实现了一个特定的自定义接口。具体来说,我想要求对象是FrameworkElement,但它还实现了一个自定义接口,称之为IExample

有什么方法可以从IExample 的声明或实际变量中做到这一点?我正在设想这样的事情(伪语法):

public FrameworkElement<IExample> ChildView { get; set; }

或者我想将其声明为对接口本身的约束:

public interface IExample : FrameworkElement

这些在 C# 中是否可行?是否有替代方案可以完成同样的事情?基本上我只想要求实例是FrameworkElement 的子类,它也实现了IExample

【问题讨论】:

  • 据我所知,不可能完全按照您的意愿行事。作为一种解决方法,您可以在 IExample 接口中声明 FrameworkElement 类型的属性。 IExample 的所有实现都将为此属性执行“return this”。

标签: c# .net uwp


【解决方案1】:

您可以在类级别使用泛型约束,然后将其应用于属性,因为属性本​​身不能直接定义约束。

public class SomeClass<T> where T : FrameworkElement, IExample {
  public T ChildView { get; set; }
}

或者在界面上

public interface ISomeInterface<T> where T : FrameworkElement, IExample {
  T ChildView { get; set; }
}

或者在方法级别,如果您想将一个类型作为参数输入,该类型既符合FrameworkElement 类型又符合IExample 的实现方式

public void SomeMethod<T>(T someParameter) where T : FrameworkElement, IExample 
{ /*do something with instance someParameter*/)

【讨论】:

  • 好的,这可以很好地声明子类,但是我如何以可以支持多个/任意实现的通用方式引用变量?我不想要求变量是SomeClass
  • @devios1 - 您可以轻松地将SomeClass 转换为接口并将该接口应用于子类型。但是,如果这不是您的意思,也许您可​​以通过以一般方式引用变量来详细说明您的意思?也许在您的问题中添加一个示例以及为什么这不起作用或者您如何看待它更加松散耦合?
  • @devios1 - 如果您的意思是您有采用这些实例的方法,那么您也可以使这些方法成为通用方法,而不要求类型是通用的。
  • 好的,如果我声明接口本身是通用的,我是否能够将我的变量创建为IExample&lt;FrameworkElement&gt; 并让它与FrameworkElement 的子类一起使用(只要它们实现@ 987654330@)?
  • 如果我想让 SomeMethod 返回 T怎么办?但是我当然不想在调用该方法时指定确切的类型。我认为这就是 OP 想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多