代码之家  ›  专栏  ›  技术社区  ›  NobodyMan

试图理解约束点-我走对了吗?

  •  3
  • NobodyMan  · 技术社区  · 16 年前

    我想我终于明白了约束点,但还是有点困惑。有人能告诉我以下内容是否正确吗?

    基本上,如果您继承一个类,那么您可能希望确保您继承的类也继承自其他类或其他接口。

    这很令人困惑,因为你可能知道你只想从一个拥有你想要的东西的类继承,但是我猜对于泛型,你可以在某一点上得到一个编译错误,而不知道问题实际上源于某个类不是从其他地方继承的事实,如果你在右侧区域添加约束。

    这有道理吗?我走对了吗?

    4 回复  |  直到 16 年前
        1
  •  4
  •   tooshel    16 年前

    我不认为这是限制因素,(但我可能错了)。

    据我所知,约束本身与继承无关。您真正要做的是对类型进行约束,如果您使用(实例化)一个具有类型参数的类,则可以使用该类型。

    带有类型参数的类类似于mad libs,约束类似于出现在空白下的指令:

    “鲍勃喜欢每晚和朋友们在一起。”(那是个疯狂的举动)

    “鲍勃喜欢每晚和朋友们在一起”(一个有指示的疯子)。

    检查一下:

    //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");
       }
    }
    
        2
  •  4
  •   Szymon Rozga    16 年前

    不完全是这样。约束用于指定通用参数可以显示哪些行为和/或类型。

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

    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 .

        3
  •  2
  •   Charles Bretana    16 年前

    不是真的。仅当定义通用类模板时,约束才适用。( 从类继承时)。

    当您定义一个泛型时,您会说这是一个“模板”或模式,对于一些尚未定义/未知的类,具有一个尚未定义的类型t,它将基于此模式和显式提供的类型t在其他地方创建。约束限制了哪些类型t可以在实际创建模板/模式的实数类型

    如在

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

    使用显式提供的类型“DerivedClass”在此处创建实际类

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

    如果且仅当派生类从SomeOtherClass继承时,它才会成功

        4
  •  0
  •   Robban    16 年前

    只能从一个类继承,但是可以实现多个接口。继承意味着类得到(继承)基类指定的任何属性和方法。只要它们没有标记为private,继承类就可以调用它们自己的方法。

    推荐文章