2009-09-11 56 views
3

我想我终于明白了约束的意义,但还是有点困惑。有人能告诉我以下情况是否正确吗?试图理解约束点 - 我在正确的轨道上吗?

基本上,如果你继承一个类,你可能想要确保你继承的类也继承自其他一些类或其他接口。

这很令人困惑,因为大概你会知道你只想从一个拥有你想要的东西的类继承,但是我猜想在泛型中,你可能会在一个点上得到编译错误,而不知道问题实际上源于事实上某些类别不会在其他地方继承,并且如果您在正确的区域添加约束,则可以获得有意义的错误。

这有道理吗?我在正确的轨道上吗?

回答

4

我不认为这是约束点,(但我可能是错的)。

据我所知,约束本质上与继承无关。如果你正在使用(实例化)一个具有类型参数的类,你真正在做的是将限制放在可能使用的类型上。

中的类类型的参数是像疯利布斯和约束都是这样的空白下出现的指示:“鲍勃喜欢每天晚上和他的朋友______”

(这是一个madlib)

“鲍勃喜欢每天晚上与他的朋友_(动词)___”(一个带指令的madlib)。

检查:

//class with type arguments 
public class MadLib<W> { 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 


//class with type arguments and contraints (note i'm not inheriting nothin) 
public class MadLib<W> where W:Verb{ 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 
+0

谢谢tooshel!这里的所有答案都非常有帮助,但我特别喜欢madlib的比喻! – NobodyMan 2009-09-11 21:24:31

0

只能从一个类继承,但是你可以实现多个接口。继承意味着你的类获得(继承)基类指定的任何属性和方法。只要它们不被标记为私有,继承类就可以调用这些方法。

2

不是。限制仅适用于定义通用类模板时,(而不是当您从类继承时)。

当你定义一个泛型时,你会说这是一个“模板”或模式,对于某些尚未定义/未知的类,还有一个尚未知的Type,T,将根据此模式在别处创建并有明确规定的类型T.哪些类型的T能够在其他地方使用的约束限制,你实际上从模板创建/模式

真正的类型,如

//Define the generic here, with arbitrary type T 
public class MyClass<T> where T: SomeOtherClass 
    { 
    // template/pattern methods, proerpties, fields, etc. 
    } 

这里创建实际的类与明确提供的类型“派生类”

public MyClass<DerivedClass> myC = new MyClass<DerivedClass>(); 

将成功当且仅当DerivedClass从SomeOtherClass

继承
4

不完全是。约束用于指定通用参数可以展现的行为和/或类型。

例如,如果你声明一个类:

class GenericDisposableHandler<T> 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // can't really do much with T since its just an object type 
    } 
} 

,知道一个事实,即泛型参数T应当始终是东西,实现IDisposable,你会怎么做:

class GenericDisposableHandler<T> where T : IDiposable 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // Now you can treat T as IDisposable 
     someVariable.Dispose(); 
    } 
} 

有是many other constraint types you can use