Tag: polymorphism

MVC局部视图中的多态ViewModel集合和渲染

我在MVC应用程序中遇到ViewModel的多态集合问题。 我通过Web服务调用收到了这个,我需要迭代它们并根据对象类型给它们自己的局部视图。 public abstract class ProvinceViewModel { public string Code { get; set; } } public sealed class OntarioViewModel : ProvinceViewModel { } public sealed class QuebecViewModel : ProvinceViewModel {} 在我看来,我试图迭代它们并分配局部视图。 我必须在这里进行大量的类型转换才能使其正常工作。 如果我尝试将其移动到控制器操作并传入抽象类型,我将得到一个错误,我们无法创建抽象类的实例。 ICollection ProvinceList; // collection receive via service @for (int i = 0, c = ProvinceList.Count; i < c; i++) { var currentProvince […]

在基类集合上调用派生方法

我有一个名为A的抽象类,以及实现A的其他类(B,C,D,E,…)。我的派生类包含不同类型的值。 我还有一个A对象列表。 abstract class A { } class B : class A { public int val {get;private set;} } class C : class A { public double val {get;private set;} } class D : class A { public string val {get;private set;} } class Program { static void Main(string[] args) { List list = new […]

虚拟调用与类型检查的另一个示例

问题 我发誓,每当我把它砸到我的脑中,我应该使用虚拟调用和类型检查(例如: if (obj is Foo) … else if (obj is Bar) … ……我想出了另一个我不知道如何实现前者的例子。 我正在通过串口实现分组化协议。 一些伪代码会解释这个: OnDataReceived: RcvPacket p = RcvPacket.ReadPacket(comport); // Call factory method if (p is RcvPacketFoo) OnFoo(); if (p is RcvPacketBar) OnBar(); OnFoo: raise Foo event OnBar: raise Bar event 基本上,ReadPacket是基类中的工厂方法 ,用于确定接收的数据包类型,并将缓冲区传递给正确的派生类型构造函数。 在此之后,我需要根据数据包的类型引发事件。 如何在不使用is运算符的情况下执行此操作? 我的方法听起来健全吗? 解 访客模式 ,当然! 谢谢Pablo Romeo 。 在这种情况下,我使控制器,即调用工厂方法,是访问者。 […]

C#中方法隐藏和阴影有什么区别?

C#中方法隐藏和阴影有什么区别? 它们是相同还是不同? 我们可以将它们称为多态(编译时或运行时)吗?

在C#中使用’new’修饰符

我读到new修饰符隐藏了基类方法。 using System; class A { public void Y() { Console.WriteLine(“AY”); } } class B : A { public new void Y() { // This method HIDES AY // It is only called through the B type reference. Console.WriteLine(“BY”); } } class Program { static void Main() { A ref1 = new A(); // Different […]

多态性与责任分工:如何避免“开启类型”

在设计具有层次关系的系统时,我经常遇到一个需要多态行为的问题,但是有多种类型的工作可以从这种多态实现中受益。 例如,考虑使用抽象语法树来组织解析的源以进行编译的编译器。 以多态方式组织逻辑很方便,因为您可能有多种类型的ValueProvider,每种类型都负责发出不同的代码以将值加载到操作堆栈上。 问题是您可能还希望对AST执行静态分析,在这种情况下,您希望对树执行完全不同的工作,但是可能具有取决于所分析节点类型的行为。 换句话说,您需要多态行为,但您不希望将分析代码与编译代码混合在一起。 我目前采用的方法是使用对象模型存储数据,该对象模型的职责是仅提供树。 然后,树的每个使用者(例如编译器或静态分析器)使用运行时类型信息来执行其逻辑的条件分支。 根据节点的类型,这不可避免地导致许多“if / else if”或“switch”编码。 只是这种丑陋的分支,多态性旨在解决,但并行,不相交的责任似乎需要它。 有没有更好的方法来构建它?

用于状态处理的多态Enum

如何在不使用C#中的switch或if语句的情况下处理枚举? 例如 enum Pricemethod { Max, Min, Average } ……我有一篇文章 public class Article { private List _pricehistorie; public List Pricehistorie { get { return _pricehistorie; } set { _pricehistorie = value; } } public Pricemethod Pricemethod { get; set; } public double Price { get { switch (Pricemethod) { case Pricemethod.Average: return Average(); case Pricemethod.Max: […]

如何使用DataContractJsonSerializer序列化/反序列化存储在对象字段中的DateTime?

我使用以下类通过两个ASP.NET服务交换JSON数据: [DataContract] public class Filter { [DataMember] public string Name {get; set;} [DataMember] public FilterOperator Operator {get; set;} [DataMember] public object Value {get; set;} } 这是问题:如果我在Value设置DateTime ,它将被反序列化为字符串: Value = “/Date(1476174483233+0200)/” 这可能是因为反序列化器无法知道最初序列化时值的类型: JSON = {“Value”:”\/Date(1476174483233+0200)\/”} __type解释的, DataContractJsonSerializer在__type属性的帮助下支持多态性。 我试图在类的顶部添加[KnownType(typeof(DateTime))]属性,但它没有帮助。 但是,如果我在Value属性(以及类中相应的KnownType属性)中设置了一个Tuple ,它就可以工作(正确反序列化的值): Value = {(10/11/2016 10:49:30 AM)} 在JSON内部, __type被__type JSON = { “Value”: { “__type” : “TupleOfdateTime:#System”, “m_Item1” […]

C#:有什么方法可以跳过多态中的一个基本调用?

class GrandParent { public virtual void Foo() { … } } class Parent : GrandParent { public override void Foo() { base.Foo(); //Do additional work } } class Child : Parent { public override void Foo() { //How to skip Parent.Foo and just get to the GrandParent.Foo base? //Do additional work } } 如上面的代码所示,我如何让Child.Foo()调用GrandParent.Foo()而不是进入Parent.Foo()? base.Foo()将我带到Parent类。

C#:通用方法不调用特定方法重载

我试图在C#中创建一个generics方法,它将根据其主体中的参数数据类型调用不同的方法,然后处理它们的结果。 我试图通过创建一个通用的包装器方法来实现这一点,然后提供处理方法的几个重载 – 包括一个通用的,如果没有特定的重载可用。 当我直接调用处理方法时,正确选择了适当的版本。 但是当我从包装器方法调用它时,它总是选择generics方法,即使我传递给它的特定数据类型存在匹配的重载。 有没有办法调整代码使其行为符合我的需要? 或者我必须使用不同的方法。 我需要代码与Mono 2.6兼容。 using System; class Program { static void Func(T val) { Console.WriteLine(“Generic Func”); } static void Func(int val) { Console.WriteLine(“Int Func”); } static void Func(string val) { Console.WriteLine(“String Func”); } static void FuncWrap(T val) { Console.Write(“Wrap: “); Func(val); } static void Main(string[] args) { Func(2); Func(“Potato”); […]