Tag: 多态性

C#generics和多态:一个矛盾?

我只是想确认一下我对C#中的Generics的理解。 这已经出现在我使用的几个代码库中,其中使用通用基类来创建类型安全的派生实例。 我正在谈论的一个非常简单的例子, public class SomeClass { public virtual void SomeMethod(){ } } public class DeriveFrom :SomeClass { public override void SomeMethod() { base.SomeMethod(); } } 当我想以多态方式使用派生实例时,问题出现了。 public class ClientCode { public void DoSomethingClienty() { Factory factory = new Factory(); //Doesn’t compile because SomeClass needs a type parameter! SomeClass someInstance = factory.Create(); someInstance.SomeMethod(); } } […]

根据子类从基类指定抽象方法的返回类型

我有以下结构: abstract class Base { public abstract List Get(); //What should be the generic type? } class SubOne : Base { public override List Get() { } } class SubTwo : Base { public override List Get() { } } 我想创建一个抽象方法,返回具体子类的任何类。 因此,从示例中可以看出, SubOne的方法应返回List而SubTwo的方法应返回List 。 我在Base类中声明的签名中指定了什么类型? [UPDATE] 谢谢你发布的答案。 解决方案是使抽象类具有通用性,如下所示: abstract class Base { public abstract List […]

无法在C#中使用相同方法的虚拟和覆盖

所以显然你不能将virtual修饰符与override修饰符一起使用。 virtual – 可以覆盖的方法 override – 一种覆盖其父类中同名方法的方法 这让我相信,如果我覆盖子类中的方法,如果该子进程有孩子,则无法再次覆盖该方法。 可以肯定地说,如果将override和virtual放在方法声明中,您将在C#中遇到编译错误。 但是我无法理解为什么我在下面创建的代码以它的方式工作 using System; public class DrawingObject { public virtual void Draw() { Console.WriteLine(“Drawing Object”); } } public class DrawDemo { public static int Main() { DrawingObject[] dObj = new DrawingObject[3]; dObj[0] = new DrawingObject(); dObj[1] = new Line(); dObj[2] = new LittleLine(); foreach (DrawingObject drawObj in […]

使用Action词典而不是switch语句

我只是在查看我的一些旧代码(有一些空闲时间),我注意到一个相当冗长的switch语句。 由于获得了新知识,我已经以下面的forms重构了它: private Dictionary createView { get { return new Dictionary() { {“Standard”, CreateStudySummaryView}, {“By Group”, CreateStudySummaryByGroupView}, {“By Group/Time”, CreateViewGroupByHour} }; } } 你会考虑这个好习惯吗,还是仅仅是一个超级丰富和不必要的案例? 我渴望确保我学到的新技术,仅仅为了它而不是聪明,并且它们实际上为代码增加了好处。 谢谢。

在实现中覆盖接口方法返回类型和派生类

我试图在类中实现(C#)接口方法,返回派生类型而不是接口中定义的基类型: interface IFactory { BaseCar GetCar(); } class MyFactory : IFactory { MyCar GetCar() { } } 当然,在哪里: class MyCar : BaseCar { } 但是,发生以下错误: ‘MyFactory’没有实现接口成员’IFactory.GetCar()’。 ‘MyFactory.BaseCar()’无法实现IFactory.GetCar()’,因为它没有匹配的返回类型’BaseCar’。 任何人都可以指出我为什么失败了,如何解决它的最佳方法?

基于类型切换行为的最佳方法

可能重复: C# – “开启类型”有比这更好的选择吗? 考虑经典: class Widget { } class RedWidget : Widget { } class BlueWidget : Widget { } 在大多数情况下,在我的UI中,我可以将所有Widget视为相同。 但是,有一些细微的差别,我需要或switch 。 可能的方法: 枚举指标 – 由构造函数设置 enum WidgetVariety { Red, Blue } class Widget { public WidgetVariety Variety { get; protected set; } } class RedWidget : Widget { public RedWidget() { Variety […]

如何根据字符串名称实例化一个类?

我有一个抽象类,我想把它推广到一个扩展它的类。 我将子类名称作为字符串。 除此以外… String childClassString; MyAbstractClass myObject; if (childClassString = “myExtenedObjectA”) myObject = new ExtenedObjectA(); if (childClassString = “myExtenedObjectB”) myObject = new ExtenedObjectB(); 我怎样才能做到这一点? 基本上我如何摆脱这里的if语句?