隐藏在c#中的方法和工作示例。为什么要在框架中实现它?什么是现实世界的优势?谁能用一个工作示例解释C#中隐藏方法的实际用法?如果方法是在派生类中使用new关键字定义的,则无法覆盖该方法。那么就和创建一个不同名称的新方法一样(基类中提到的方法除外)。使用new关键字有什么具体原因吗?C#不仅支持方法覆盖,还支持方法隐藏。简单地说,如果该方法没有覆盖派生方法,它就会隐藏它。必须使用new关键字声明隐藏方法。所以第二个清单中正确的类定义是:usingSystem;命名空间多态性{classA{publicvoidFoo(){Console.WriteLine("A::Foo()");}}classB:A{publicnewvoidFoo(){Console.WriteLine("B::Foo()");}}classTest{staticvoidMain(string[]args){Aa;乙乙;a=新A();b=新B();a.Foo();//输出-->"A::Foo()"b.Foo();//输出-->"B::Foo()"a=newB();a.Foo();//output-->"A::Foo()"}}}我有时对new关键字的一种用法是在并行继承树中使用“穷人的属性协方差”。考虑这个例子:publicinterfaceIDependency{}publicinterfaceConcreteDependency1:IDependency{}publicclassBase{protectedBase(IDependencydependency){MyDependency=dependency;}protectedIDependencyMyDependency{get;privateset;}}public:classDerived//Base1Derived1dependsonConcreteDependency1{publicDerived1(ConcreteDependency1dependency):base(dependency){}//new关键字允许在派生类中定义一个属性//转换基类输入正确的具体类型privatenewConcreteDependency1MygetDepend{{return(ConcreteDependency1)base.MyDependency;}}}继承树Derived1:Base对ConcreteDependency1:IDependency具有“并行依赖”。在派生类中,我知道MyDependency是ConcreteDependency1类型,所以我可以使用new关键字从基类中隐藏属性getter。编辑:有关新关键字的详细说明,请参阅EricLippert的这篇博客文章。我觉得ArsenMkrt的例子不太对,至少没有完全解释隐藏功能。通过从类B中的Foo方法中删除new关键字,您仍然可以获得输出A::Foo()B::Foo()A::Foo()在像Java这样的编程语言中,所有方法都是“虚拟的”,你想得到输出A::Foo()B::Foo()B::Foo()通过上面的ArsenMkrt代码,由于Aa的实例化;乙乙;a=新A();b=新B();a.Foo();b.Foo();一个=新B();//然而,在他的例子中,你仍然得到“A::Foo()”,因为在C#中方法默认不是虚拟的,所以方法B::Foo()自动隐藏了A的Foo()。要实现多态行为,必须这样写:classA{publicvirtualvoidFoo(){Console.WriteLine("A::Foo()");}}classB:A{publicoverridevoidFoo(){Console.WriteLine("B::Foo()");这就是“new”关键字的用武之地。实际上,当您从B::Foo()中保留“override”时,您又隐藏了A::Foo(),这意味着您不会覆盖它的默认行为,并且您不要实现多态性,即你再次得到“A::Foo()”作为输出。同样可以实现-在这里我不是100%理解你为什么要放它-通过放置像..classA{publicvirtualvoidFoo(){Console.WriteLine("A::福()“);}}classB:A{publicnewvoidFoo(){Console.WriteLine("B::Foo()");然后你再次得到输出A::Foo()B::Foo()A::Foo()是一个稍微模糊的场景,其中方法隐藏是合适的,但缺乏任何干净的惯用方式来表达它,在基类将受保护的成员公开给可继承的后代,但后代知道没有其他派生类可以在不破坏事物的情况下使用该成员。许多类(但很少)应该隐藏的方法的一个主要示例是MemberwiseClone()。在许多情况下,如果一个类有一个私有成员,该成员希望成为对可变对象的唯一现有引用,则派生类不可能正确使用MemberwiseClone()。请注意,隐藏受保护成员并不构成违反LSP。与LSP的一致性要求代码可能期望引用基类对象但接收到派生类对象的引用,后者对象的行为应该像基类对象。然而,受保护的成员在LSP的范围之外,因为每个类型都完全知道它的基类型。如果Bar和Boz都来自Foo,并且Boz隐藏了Bar需要的受保护成员,那么Boz隐藏该成员的事实不会影响Bar,因为Bar的基类型实例不可能是Boz或Foo以外的任何其他实例。没有替代是可能的,所以可替代性是无关紧要的。这可能会有所帮助。classBase{publicvoidF(){}}classDerived:Base{publicvoidF(){}//警告,隐藏了一个继承的名字}上例中,F在Derived中的声明导致报警告。隐藏继承的名称尤其不是错误,因为这会排除基类的单独演化。例如,上述情况可能是因为较新版本的Base引入了F方法,而该方法在该类的早期版本中不存在。如果以上是错误的,在单独版本化的类库中对基类的任何更改都可能导致派生类失效。来源:https://msdn.microsoft.com/en-us/library/aa691135%28v=vs.71%29.aspx有一次您需要在基类方法上添加/修改属性。例如:[Browsable(true)][EditorBrowsable(EditorBrowsableState.Always)]publicneweventEventHandlerTextChanged{add{base.TextChanged+=value;}移除{base.TextChanged-=value;基类Control类有一个TextChanged事件,但基类事件有各种属性可以防止它出现在智能感知或设计器中。因为我使用的类广泛使用了Text属性和TextChanged事件,所以我希望TextChanged事件显示在智能感知中并在属性窗口中可见。以上是关于C#学习教程:C#中的隐藏方法和工作示例的全部内容。为什么要在框架中实现它?什么是现实世界的优势?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
