Tag: 多态性

使用基类作为WCF服务的参数

我有一个多项目解决方案。 One Project提供了一个包含多个类的DLL。 其中一个类是WorkerTemplate 。 另外两个类inheritance自它,即ExecSQLWorker和CopyWorker class ExecSQLWorker : WorkerTemplate {}; class CopyWorker: WorkerTemplate {}; 在我的WCF服务中,我有我的界面: public interface IPQWService { [OperationContract] void EnqueueWorker(WorkerTemplate[] worker); } 现在,在我的客户端应用程序中, WorkerTemplate[]由ExecSQLWorker和CopyWorker对象组成。 当我现在尝试调用EnqueueWorker(worker)方法时,我收到一个错误,告诉我序列化worker类时出现问题。 所以我想这是因为服务在序列化基类时确实存在问题,而是获取inheritance类。 但是如何轻松解决这个问题? 编辑:例外: Unhandled Exception: System.ServiceModel.CommunicationException: There was an error while trying to serialize parameter http://tempuri.org/:worker. The InnerException message was ‘Type ‘DV_BII30.ExecSQLWorker’ with data contract name ‘ExecSQLWorker:http://schemas.datacontract.org/2004/07/DV_BII30’ […]

为什么编译器选择错误的方法重载?

我有这个简单的方法: public void CacheDelegate(Object obj, MemberInfo memberInfo) { switch (memberInfo.MemberType) { case MemberTypes.Field: var fieldInfo = (FieldInfo) memberInfo; CacheDelegate(obj, fieldInfo); break; case MemberTypes.Property: var propertyInfo = (PropertyInfo) memberInfo; CacheDelegate(obj, propertyInfo); break; case MemberTypes.Method: var methodInfo = (MethodInfo) memberInfo; CacheDelegate(obj, methodInfo); break; default: throw new Exception(“Cannot create a delegate for MemberInfo provided.”); } } 上面的方法解析了memberInfo的类型,并从以下方法调用适用的方法: public […]

接口指定的属性的多态性

为什么这不起作用? public class ClassOptions {} public interface Inode { ClassOptions Options {get;} } public class MyClass : Inode { public ClassOptions Options { get; set; } } public class ClassDerivedOptions : ClassOptions { } public class MyDerivedClass : Inode { public ClassDerivedOptions Options { get; set; } << does not implement INode… } [编译器消息告诉我为什么它会中断,但我想知道编译器为什么不通过它的原因 – […]

generics运行时或编译时多态吗?

我读到以下格式属于参数多态,但是我们可以将它分为一个,运行时或编译时多态吗? public class Stack { // items are of type T, which is known when we create the object T[] items; int count; public void Push(T item) {…} //type of method pop will be decided when we create the object public T Pop() {…} }

如何增加属性的访问修饰符

我正在尝试创建一组类,其中共同的祖先负责设置各种属性所涉及的所有逻辑,后代只是根据特定后代是否需要来更改属性的访问权限。 当我尝试如下所示执行此操作时,我收到编译器错误: “在覆盖’protected’inheritance的成员时,无法更改访问修饰符” 有没有办法实现我想要做的事情? 谢谢 public class Parent { private int _propertyOne; private int _propertyTwo; protected virtual int PropertyOne { get { return _propertyOne; } set { _propertyOne = value; } } protected virtual int PropertyTwo { get { return _propertyTwo; } set { _propertyTwo = value; } } } public class ChildOne : Parent […]

IList 和List 与接口的转换

我一般都了解接口,inheritance和多态,但有一件事令我困惑。 在这个例子中, Cat实现了IAnimal ,当然List实现了IList : IList cats = new List(); 但它会生成编译错误(无法隐式转换类型…) 。 如果我使用Catinheritance的asbtract超类[Animal],它也将无法工作。 但是,如果我用Cat替换IAnimal : IList cats = new List(); 它编译得很好。 在我看来,因为Cat实现了IAnimal ,所以第一个例子应该是可接受的,允许我们返回列表和包含类型的接口。 谁能解释为什么它无效? 我确信这是一个合乎逻辑的解释。

有没有理由在界面中隐藏inheritance的成员?

我知道从另一个类inheritance的类可能会使用new关键字隐藏属性。 但是,这隐藏了属性的特定实现,因此我可以看到它是如何使用的。 是否有任何实际的理由在实现其他接口的接口中隐藏成员? 例如,考虑下面的例子。 IChildInterface实现了IParentInterface ,并隐藏了PropertyA 。 interface IParentInterface { string Name { get; set; } int PropertyA { get; set; } int PropertyB { get; set; } } interface IChildInterface : IParentInterface { int PropertyA { get; set; } int PropertyC { get; set; } }

C#多态性

运行时多态性和编译时多态性之间有什么区别? 另外,早期绑定和后期绑定有什么区别? 例子将受到高度赞赏。

将派生类转换为基类

我正试图刷新我的记忆但无法找到谷歌的答案。 public class BaseClass { public virtual void DoSomething() { Trace.Write(“base class”); } } public class DerivedClass : BaseClass { public override void DoSomething() { Trace.Write(“derived class”); } } 如果我创建一个派生类的实例,我该如何将它转换为它的基类,这样当调用DoSomething()时,它只使用基类的方法? 动态转换仍然会调用派生类的重写方法: DerivedClass dc = new DerivedClass(); dc.DoSomething(); (dc as BaseClass).DoSomething(); 输出:“派生类”

C#多态性简单问题

我有一个类X和一个Y类,后者派生自X: class x {} class y : x {} 然后我在某处使用X列表: List lstX; … 然后我想从我的其他列表中的数据中使用一个新的Y列表……沿着这些方向: List lstY = lstX; 我相信X列表中的项目会自动转换为Y,但事实并非如此。 另外,我如何从某个X初始化Y的新实例? 我想要做 : var newX = new X(); var newY = new Y(X); 但它似乎并没有像那样工作。 谢谢你的帮助! 抱歉格式化,尽我所能