Tag: 多态性

动态可交换数据访问层

我正在编写一个数据驱动的WPF客户端。 客户端通常从WCF服务中提取数据,该服务查询SQL数据库,但我希望选择直接从SQL或其他任意数据源提取数据。 我想出了这个设计,并希望听听你对它是否是最好的设计的看法。 首先,我们要从SQL中提取一些数据对象。 // The Data Object with a single property public class Customer { private string m_Name = string.Empty; public string Name { get { return m_Name; } set { m_Name = value;} } } 然后我计划使用所有数据访问层应该实现的接口。 假设一个人也可以使用抽象类。 思考? // The interface with a single method interface ICustomerFacade { List GetAll(); } 可以创建SQL实现。 // […]

扩展页面类

是否可以在C#的WPF工具包(或者其他任何WPF类)中扩展“Page”类? 我试图做的: public class ExtendedPage : Page{ protected void doStuff(){ // lots of joy n pleasure } } public partial class RandomWindow : ExtendedPage{ private void randomMethod(){ doStuff(); // causes error } } 我问的原因非常明显:在扩展Page-class(ExtendedPage)之后,子类(RandomWindow)无法访问其基类的方法。 这是(至少是我的猜测)由RandomWindow偏离的情况引起的。 由于这个类不幸是由WPF生成的(链接到相应的* .xaml),我无法找到部分类的其他部分。 这个问题可能导致一个非常明显的答案,让我看起来像一个完全白痴,但显然我无法弄明白。 我可能会补充一点,我刚刚开始使用C#,我的编程起源是Java。 确切的错误消息是“’type’的部分声明不能指定不同的基类”(CS0263)。 作为对其中一条评论的回应:* .xaml中的“Page”声明似乎生成了一个代码隐藏文件,其基类是“Page”(而不是ExtendedPage)。 改变这似乎也不起作用,编译器抱怨没有找到类型的ExtendedPage。 // to

C#数字基类

我想写一个可以接受任何数字的C#方法。 就像是: public static T Sum(T a, T b) where T : number { // (not real code) return a + b; } 但我没有在C#中看到一个“数字”基类,就像我用过的大多数其他语言一样。 数值类型是IComparable,IFormattable,IConvertible,IComparable和IEquatable,但似乎没有任何算术function。 除了物体之外,它们都是结构,没有明显的共同超类。 (请原谅我,如果我搞砸了这里的意思,因为我不太熟悉C#结构,而且正是他们对类的所有方式都不太熟悉。) 我是否遗漏了某些内容,或者是否无法在C#中编写一个执行“a + b”的方法而没有在“+”的上下文中明确指出a和b是什么?

如何在C#中执行“静态重载const”?

我正在用C#创建一个游戏。 每个级别由几个瓷砖组成。 每个瓷砖都是某种类型,例如草地,木墙等。 理想情况下,我希望有一个基类“Tile”并从中inheritance为每种类型的tile创建类。 我想让tile的属性成为子类的某种static / const / etc成员,因为每种类型的tile都只具有相同的属性。 即我不希望100 Tiles有一个属性都具有相同的值,这似乎相当低效。 问题是你不能在C#中做到这一点。 有没有办法实现我想要的? 我的另一个想法是将它们全部分成树,一个只有表示实例的类“Tile”和另一个“TileType”,我从中为每种类型实例化一个对象,并可能通过某种“TileTypeCollection”访问它们。 这感觉很奇怪,我宁愿以第一种方式去做。 处理这种情况时是否有任何一般指导原则?

C#4会允许“动态铸造”吗? 如果没有,C#应该支持吗?

我不是指将更低的接口或基类转换为更多派生类的意义上的动态转换,我的意思是采用我创建的接口定义,然后动态地向该接口转换不是从该接口派生的不同对象接口但支持所有呼叫。 例如, interface IMyInterface { bool Visible { get; } } TextBox myTextBox = new TextBox(); IMyInterface i = (dynamic)myTextBox; 这可以在编译时针对已知类型实现,而运行时针对使用dynamic声明的实例实现。 接口定义是已知的,类型(在此示例中)也是如此,因此编译器可以确定对象是否支持接口定义的调用,并为我们执行一些魔术以进行转换。 我的猜测是C#4不支持这个(我无法找到它的引用),但我想知道肯定。 如果不是,我想讨论它是否应该包含在该语言的未来变体中,以及支持和反对的原因。 对我来说,似乎是一个很好的补充,可以在代码中实现更大的多态性,而无需创建全新的类型来包装现有的框架类型。 更新 为免有人指责我抄袭,我不知道Jon Skeet已经提出过这个问题 。 但是,很高兴知道我们想到了非常相似的语法,这表明它至少可能是直观的。 与此同时,“有一个独创性的想法”仍然在我的清单上再次出现。

多态如何在C#中使用未定义的中间类型?

在下面的代码中,我a.Generate(v)期望调用a.Generate(v)会导致调用V.Visit(A a) ,因为当调用Generate时this是A类型的Hoewever,看来this被认为是Inter 。 是否有可能在没有在A和B显式实现(相同)方法而只在共享基类上实现预期的行为? 如果是这样,怎么能实现呢? using System; using System.Diagnostics; namespace Test { class Base {} class Inter: Base { public virtual void Generate(V v) { // `Visit(Base b)` and not `Visit(A a)` is called when calling // A.Generate(v). Why? v.Visit(this); } } class A: Inter {} class B: Inter {} class V { public […]

在c#中实现多态性,如何做到最好?

第一个问题在这里,所以希望你们都会轻轻地对我说话! 在过去的几天里,我一直在阅读关于多态的非常多的内容,并试图将它应用到我在c#中所做的事情,似乎有几种不同的方法来实现它。 我希望我已经掌握了这个,但即使我没有澄清,我也很高兴。 从我所看到的,我有3个选择: 我可以从基类inheritance并在我希望派生类重写的任何方法上使用关键字’ virtual ‘。 我可以用虚方法实现一个抽象类,并以这种方式实现, 我可以使用界面吗? 从我所看到的,如果我不需要基础中的任何实现逻辑,那么一个接口给了我最大的灵活性(因为我当然不限制我自己的多重inheritance等),但如果我需要基础为了能够在派生类正在做的事情之上做一些事情,那么使用1或2将是更好的解决方案? 感谢有关这些人的任何意见 – 本周末我已阅读了很多内容,无论是在本网站还是其他地方,我认为我现在理解这些方法,但我只是想以语言特定的方式澄清如果我在右边跟踪。 希望我也正确地标记了这一点。 干杯,特里

基于编译时类型的运行时类型的调用方法

在应用程序中,我需要.NET基于其运行时类型而不是其编译时类型来调用方法。 简化示例: class A { } class B : A { } static void Main(string[] args) { A b = new B(); Print(b); } static void Print(A a) { Console.WriteLine(“Called from A”); } static void Print(B b) { Console.WriteLine(“Called from B”); } 上面的代码实际上是打印Called from A ,但我需要它Called from B 。 这按预期工作: static void Print(A a) { […]

C#与C ++中的虚拟调用速度

我似乎记得在某个地方读过C#虚拟调用的成本并不像在C ++中那么高。 这是真的? 如果是这样 – 为什么?

协方差如何比多态更冷……而不是多余的?

.NET 4引入了协方差。 我想这很有用。 毕竟,MS经历了将其添加到C#语言的所有麻烦。 但是,为什么协方差比良好的旧多态更有用呢? 我写这个例子来理解为什么我应该实现Covariance,但我仍然没有得到它。 请赐教。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { class Demo { public delegate void ContraAction(T a); public interface IContainer { T GetItem(); void Do(ContraAction action); } public class Container : IContainer { private T item; public Container(T item) { this.item = item; } public T […]