jjzjj

polymorphism

全部标签

c# - 没有访客模式的动态调度

问题我正在使用一个已经存在的库,我无法访问它的源代码。这个库代表一个AST。我想复制此AST的部分内容,但在此过程中重命名对变量的引用。因为可以有一个AssignCommand-Object,它包含一个Expression-object,我希望能够用它自己的函数复制每个对象,这样我就可以递归地调用它们。但是,由于我无权访问库的代码,因此我无法添加诸如CopyAndRename(stringprefix)之类的方法。.因此,我的方法是创建一个函数Rename有几个重载。因此,我将有一个家庭功能如下:publicstaticCommandRename(Commandcmd,stringpr

c# - 如何遵守 Liskov 替换原则 (LSP) 并仍然受益于多态性?

LSP说“派生类型不能改rebase类型的行为”,换句话说“派生类型必须完全可以替换它们的基类型”。这意味着如果我们在基类中定义虚方法,我们就违反了这个原则。另外,如果我们使用new关键字在驱动方法中隐藏一个方法,那么我们又违反了这个原则。换句话说,如果我们使用多态性,我们就违反了LSP!在许多应用程序中,我在基类中使用了虚拟方法,现在我意识到它违反了LSP。另外,如果你使用模板方法模式,你就违反了我经常使用它的原则。那么,当您需要继承并且还希望从多态性中获益时,如何设计符合此原则的应用程序呢?我很困惑!请参阅此处的示例:http://www.oodesign.com/liskov-s

c# - 通过扩展方法实现多态性?

我有一个类库,其中包含一些基类和派生自它们的其他类。在这个类库中,我利用多态性来做我想做的事。现在在一个消费应用程序中,我想根据子类的运行时类型更改某些代码的行为。所以假设如下:publicclassBase{}publicclassChild1:Base{}publicclassChild2:Base{}现在在消费应用程序中我想做如下事情(注意以下所有类都在消费应用程序中,不能在类库中引用):publicinterfaceIMyInterface1{}publicinterfaceIMyInterface2{}publicstaticclassExtensions{publicsta

c# - 为什么静态和非静态方法不能共享相同的签名?

C#提供以下signaturecharacteristics在函数重载时使用。我们知道重载只考虑参数;它们的数量和类型,但多态性的目标是根据调用策略提供相同的名称但不同的用法。如果我有一个类包含两个具有相同名称和签名的方法,而一个是静态的而另一个不是,C#编译器会抛出一个错误;“Classalreadydefinedamembercalled'foo'withthesameparametertypes”.对这两种方法的调用将有所不同;一个带有对象名称,一个带有类名称的静态。因此调用策略没有歧义。那为什么会报错呢?classExample{publicvoidfoo(){}publics

C# - 当 Dog 是 Animal 的子类时,如何将 List<Dog> 转换为 List<Animal>?

我有一个类Animal,及其子类Dog.我有一个List我想添加一些List的内容到List.有没有比只投List更好的方法呢?到List,然后使用AddRange? 最佳答案 如果您使用的是C#4,则不需要转换:Listanimals=newList();Listdogs=newList();animals.AddRange(dogs);这是允许的,因为AddRange()接受IEnumerable,即covariant.如果您没有C#4,那么您将不得不迭代List并转换每个项目,因为协方差只是在那时添加。您可以通过.Cast完成

c# - 根据子类指定基类抽象方法的返回类型

我有以下结构:abstractclassBase{publicabstractListGet();//Whatshouldbethegenerictype?}classSubOne:Base{publicoverrideListGet(){}}classSubTwo:Base{publicoverrideListGet(){}}我想创建一个抽象方法,返回具体子类的任何类。因此,正如您从示例中看到的那样,SubOne中的方法应该返回List而SubTwo中的方法应该返回List.我在基类中声明的签名中指定什么类型?[更新]感谢您发布的答案。解决方案是使抽象类通用,如下所示:abstrac

c# - 方法重载和多态性

classProgram{staticvoidMain(string[]args){ListmyList=newList{newA(),newB(),newC()};foreach(varainmyList){Render(a);}Console.ReadKey();}privatestaticvoidRender(Ao){Console.Write("A");}privatestaticvoidRender(Bb){Console.Write("B");}privatestaticvoidRender(Cc){Console.Write("C");}}classA{}classB:A

c# - C# 中的存在类型?

我目前在C#中遇到一个问题,我认为可以使用存在类型来解决。但是,我真的不知道它们是否可以在C#中创建或模拟(使用其他一些构造)。基本上我想要一些这样的代码:publicinterfaceMyInterface{TGetSomething();voidDoSomething(Tsomething);}publicclassMyIntClass:MyInterface{intGetSomething(){return42;}voidDoSomething(intsomething){Console.Write(something);}}publicclassMyStringClass:My

c# - WCF 中的多态性

我正在考虑构建一个可以存储/检索一系列不同类型的WCF服务。以下示例是否可行并且也被认为是可接受的设计:[ServiceContract]publicinterfaceIConnection{[OperationContract]IObjectRetrieveObject(GuidObjectID);[OperationContract]GuidStoreObject(IObjectNewObject);}[ServiceContract][ServiceKnownType(IOne)][ServiceKnownType(ITwo)]publicinterfaceIObject{[Da

c# - 在 C# 中使用 'new' 修饰符

我读到new修饰符隐藏了基类方法。usingSystem;classA{publicvoidY(){Console.WriteLine("A.Y");}}classB:A{publicnewvoidY(){//ThismethodHIDESA.Y.//ItisonlycalledthroughtheBtypereference.Console.WriteLine("B.Y");}}classProgram{staticvoidMain(){Aref1=newA();//DifferentnewAref2=newB();//PolymorpishmBref3=newB();ref1.Y(