2014-02-25 45 views
6

我建立了下面的类:自泛型类型

abstract class Foo 
{ 
    protected abstract void Process(FooProcessor<T> processor) 
} 

我需要的是让T是孩子Foo类的类型:

class FooChild : Foo 
{ 
    protected override void Process(FooProcessor<FooChild> processor) 
    { 
    } 
} 

它是可以实现的?如果是这样,怎么样?

回答

6

有点像自我约束可以让你暴露派生类型也限制在同一时间:

abstract class Foo<T> where T : Foo<T> 
{ 
    protected abstract void Process(FooProcessor<T> processor); 
} 

然后派生类型定义自己的目标:

class FooChild : Foo<FooChild> 
{ 
    protected override void Process(FooProcessor<FooChild> processor) 
    { 
    } 
} 

请注意尽管这种设计往往只有一小部分用途。此外,您将失去将Foo作为基础而不指定其通用类型的能力。

还有一个blog post from Eric Lippert关于如何滥用这个设计,所以你可能想要考虑你想要让你的受保护的方法直接引用派生类,你实际上试图达到的是什么。

您可能会更好地使用接口来封装您试图实现的行为。

+0

在这种情况下,孩子CHASS签名是很奇怪.. –

+0

我不认为它可能,因为Foo是通用的 - 没有非泛型的Foo类 –

+0

@SergeyMetlov我已经看到过这种方法能够从基类型暴露强类型的派生类的引用,它总是感觉有点向后,坦白说我没有亲自需要使用这种方法。 –

1

你的意思是这样的:

class FooProcessor<T> 
{ 
} 

abstract class Foo<T> 
{ 
    protected abstract void Process(FooProcessor<T> processor); 
} 

class FooChild : Foo<FooChild> 
{ 
    protected override void Process(FooProcessor<FooChild> processor) 
    { 
    } 
} 

这将是更容易使用的界面来实现:

interface FooProcessor<T> 
{ 
} 

interface Foo<T> 
{ 
    void Process(FooProcessor<T> processor); 
} 

class FooChild : Foo<FooChild> 
{ 
    void Foo<FooChild>.Process(FooProcessor<FooChild> processor) 
    { 
     this.Process((FooProcessorFooChild)processor); 
    } 

    protected void Process(FooProcessorFooChild processor) 
    { 
    } 
} 

class FooProcessorFooChild : FooProcessor<FooChild> 
{ 
} 
+0

'FooChild:Foo '这是很奇怪的。有没有办法避免这种混乱的签名? –

+0

@SergeyMetlov:第二个更好吗?注意我个人更喜欢第一个。 –

+0

和我一样。更复杂。 –