我正在从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”行为的每个“分组”设置单独的接口。
答案 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中的属性。