2010-03-18 69 views
2

我有以下的C#类:泛型:如何从两个类中的一个派生?

class A : Object 
{ 
    foo() {} 
} 

class B : Object 
{ 
    foo() {} 
} 

我想写的是适用于一般的方法:

void bar<T>(T t) 
{ 
    t.foo(); 
} 

这并不编译抱怨,把foo()不是T的成员。我可以添加一个约束,从T派生的类之一:

void bar<T>(T t) where T : A 

但我怎么能为它们都?

+0

从问题中转移得很少。 如果这是用例,它是否有意义有一个通用的方法? 为什么不简单地将接口'IFoo'实现为A和B,并将该方法声明为 void bar(IFoo f){ f.foo(); } – Biswanath 2010-03-18 20:58:50

回答

5

简单地说,你不能。有几种方法可以解决这个问题。

最常见的是使用接口。说IMyType

interface IMyType { void foo(); } 
class A : IMyType ... 
class B : IMyType ... 

void bar<T>(T t) where T : IMyType { 
    t.Foo(); 
} 

这是一个有点沉重的重量,虽然是它需要一个解决方案元数据的变化。更便宜的方法是提供一个调用适当函数的lambda表达式。

void bar<T>(T t, Action doFoo) { 
    ... 
    doFoo(); 
} 

var v1 = new A(); 
var v2 = new B(); 
bar(v1,() => v1.Foo()); 
bar(v2,() => v2.Foo()); 
1

定义一个接口,该接口包含foo方法,并且具有类A & B实现该接口。然后在你的泛型类型上定义一个接口约束。

1

你不能这样做,除非你:

  1. 从一个接口基类
  2. 导出导出

我喜欢的界面,因为它不强制你分享行为:

public interface IHasFoo 
{ 
    void foo(); 
} 

public class B : IHasFoo // you don't need to explicitly subclass object 
{ 
    public void foo() 
    { 
    } 
} 

public class A : IHasFoo // you don't need to explicitly subclass object 
{ 
    public void foo() 
    { 
    } 
} 

void bar<T>(T t) where T : IHasFoo 
{ 
    t.foo(); // works 
} 
2

你应该定义一个接口:

interface IFoo 
{ 
    void foo(); 
} 


class A : IFoo 
{ 
    public void foo() {} 
} 

class B : IFoo 
{ 
    public void foo() {} 
} 

而且你的泛型方法:

void bar<T>(T t) where T:IFoo 
{ 
    t.foo(); 
} 
1

这可能是在.NET 4.0中使用dynamic

void bar(dynamic t) 
{ 
    t.foo(); 
} 
0

你为什么使这个通用?只需重载该方法。

void bar(A a) { a.Foo(); } 
void bar(B b) { b.Foo(); } 

泛型在那里,所以你可以使潜在的无限bar()方法。

相关问题