Tag: polymorphism

多态性和铸造

我想了解c#中的多态性,所以通过尝试几个构造我想出了以下案例: class Shape { public virtual void Draw() { Console.WriteLine(“Shape.Draw()”); } } class Circle : Shape { public override void Draw() { Console.WriteLine(“Circle.Draw()”); } } 我理解为了将Draw()消息发送到几个相关对象,所以他们可以根据自己的实现行事我必须更改(在这种情况下)形状’指向’的实例: Shape shape = new Circle(); shape.Draw(); //OK; This prints: Circle.Draw() 但是,为什么,当我这样做时: Circle circle = new Circle(); circle.Draw(); //OK; This prints: Circle.Draw() Shape shape = circle as Shape; // or […]

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

我有一个类Animal ,它的子类Dog 。 我有一个List ,我想将一些List的内容添加到List 。 有没有更好的方法,只需将List转换为List ,然后使用AddRange ?

如何使用显式成员映射配置AutoMapper for Polymorphism?

考虑以下基本情况: Mapper.CreateMap() .Include() .Include(); Mapper.CreateMap() .ForMember( m => m.P0, a => a.MapFrom( x => x.Prop0 ) ) .ForMember( m => m.P1, a => a.MapFrom( x => x.Prop1 ) ); Mapper.CreateMap() .ForMember( m => m.P0, a => a.MapFrom( x => x.Prop0 ) ) .ForMember( m => m.P2, a => a.MapFrom( x => x.Prop2 ) ); Mapper.AssertConfigurationIsValid(); […]

你如何在Ruby中做多态?

在C#中,我可以这样做: class Program { static void Main(string[] args) { List animals = new List(); animals.Add(new Dog()); animals.Add(new Cat()); foreach (Animal a in animals) { Console.WriteLine(a.MakeNoise()); a.Sleep(); } } } public class Animal { public virtual string MakeNoise() { return String.Empty; } public void Sleep() { Console.Writeline(this.GetType().ToString() + ” is sleeping.”); } } public class Dog […]

调用多态字段事件

考虑以下代码: public class TableMain { public virtual event Action UpdateFilter; …. } public class TableSub : TableMain { public override event Action UpdateFilter; public void UpdateQuery() { ….. if (UpdateFilter!=null) { UpdateFilter(); // Invocation of polymorphic field-like event??? } } } 在此代码中, ReSharper显示警报“调用多态字段事件”。 我的问题是:它究竟意味着什么? 这是一个糟糕的编程习惯的警报吗? 此外,以多态方式调用事件是不好的做法吗? (知道事件只能从声明它的类中提出。)

接口是否与多态性兼容

我遇到了与多态类型(甚至多态接口)交互的接口概念的问题。 我正在开发C#,并希望能够接近这个定义的答案,尽管我认为这仍然为每个人提供了足够的空间来提出答案。 举个例子,假设你想制作一个绘制东西的程序。 您为Paints定义了一个接口,并为绘制的主题定义了一个接口。此外,您还有一些可以更具体的方式绘制的主题。 interface IPainter { void paint(IPaintable paintable); } interface IPaintable { void ApplyBaseLayer(Color c); } interface IDecalPaintable : IPaintable { void ApplyDecal(HatchBrush b); } 我可以想象制作一个类似于以下的画家: class AwesomeDecalPainter : IPainter { public void paint(IPaintable paintable) { IDecalPaintable decalPaintable = (IDecalPaintable)paintable; decalPaintable.ApplyBaseLayer(Color.Red); decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green)); } } 当然,如果paintable没有实现IDecalPaintable,这将抛出。 它立即引入了IPainter实现与其操作的IPaintable之间的耦合。 但是我也认为说AwesomeDecalPainter不是IPainter是不合理的,因为它的使用仅限于IPaintable域的一个子集。 所以我的问题实际上是四方面的: 接口是否与多态性兼容? 实现可以在IDecalPaintable上运行的IPainter是一个好的设计吗? 如果它可以专门在IDecalPaintable上运行呢? […]

为什么这样做? 方法重载+方法重写+多态

在以下代码中: public abstract class MyClass { public abstract bool MyMethod( Database database, AssetDetails asset, ref string errorMessage); } public sealed class MySubClass : MyClass { public override bool MyMethod( Database database, AssetDetails asset, ref string errorMessage) { return MyMethod(database, asset, ref errorMessage); } public bool MyMethod( Database database, AssetBase asset, ref string errorMessage) { // […]