Tag: inheritance

为什么我的表现慢慢爬行我将方法移动到基类?

我在C#中编写了不可变二进制树的不同实现,我希望我的树从基类inheritance一些常用方法。 不幸的是,从基类派生的类非常慢。 非派生类可以充分发挥作用。 以下是两个几乎相同的AVL树实现,用于演示: AvlTree: http ://pastebin.com/V4WWUAyT DerivedAvlTree: http ://pastebin.com/PussQDmN 这两棵树的代码完全相同 ,但我在基类中移动了DerivedAvlTree.Insert方法。 这是一个测试应用程序: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Juliet.Collections.Immutable; namespace ConsoleApplication1 { class Program { const int VALUE_COUNT = 5000; static void Main(string[] args) { var avlTreeTimes = TimeIt(TestAvlTree); var derivedAvlTreeTimes = TimeIt(TestDerivedAvlTree); Console.WriteLine(“avlTreeTimes: {0}, derivedAvlTreeTimes: {1}”, avlTreeTimes, derivedAvlTreeTimes); } static […]

覆盖ComboBox的DrawItem

我更改了各种控件的高亮颜色,我打算进行更多更改。 因此,我最好创建自己的控件并重用它们,而不是为每个控件进行更改。 我创建了一个新的用户控件,并inheritance自System.Windows.Forms.ComboBox 。 问题是我无法像onClick那样找到覆盖onDraw的方法。 那我该如何去改写呢? 这是我用于每个控件onDraw事件的代码 public void comboMasterUsers_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); Graphics g = e.Graphics; Brush brush = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? Brushes.LightSeaGreen : new SolidBrush(e.BackColor); g.FillRectangle(brush, e.Bounds); e.Graphics.DrawString(comboMasterUsers.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericDefault); e.DrawFocusRectangle(); } 谢谢!

使用安全向下转换的类设计选项

在经历了向下倾斜(见[我的原帖] )并制作[深拷贝]之后 ,我发现[这个同名文章]在C ++中提出了如何处理这个问题的建议。 我非常兴奋,我在C#中实现了如下: public partial class User { virtual public Employer GetEmployer() { return null; } … } public partial class Employer { public override Employer GetEmployer() { return this; } … } 然后我像这样使用: User u = GetUser(); Employer e = u.GetEmployer(); 但是(我想,毫不奇怪),从不调用覆盖并返回null。 我试图解决的问题是我收集的将是一个非常常见的用例:我得到一些我需要存储的数据,但它不完整。 后来我获得了更多数据,并用它来改进(低估)我对世界的理解。 在这种特殊情况下,我从使用我网站的人那里得到一个电子邮件地址,所以我知道他们是User ,但总的来说,我不知道其他任何关于他们的信息。 后来(当他们填写表格时),我知道他们实际上是Employer ,所以我需要低估我的User 。 这里的正确方法是什么?

如何在C#中使用派生返回类型覆盖方法?

我想用派生类类型覆盖虚方法。 目前最好的方法是什么? 到目前为止,我发现了两种方法: 为每个派生类型使用abstract基class ; 桥接与protected方法。 使用带有public访问器的protected实现。 基本情况(没有实现解决方案, Clone总是返回基类型A1 ): public class A1 { public int X1 { get; set; } public A1(int x1) { this.X1 = x1; } public virtual A1 Clone() { return new A1(X1); } } public class A2 : A1 { public int X2 { get; set; } public A2(int x1, […]

inheritance对象的XML反序列化

我有一个对象InputFile ,它有数组和对象来保存文件的内容。 我还有从ABCFileinheritance的ABCFile和XYZFile ,它们将读取不同类型的文件并将它们存储到InputFile的预计成员中。 由于这两个对象的序列化和反序列化与父对象相同,因此我在父对象上实现了标准的XML序列化接口。 在反序列化期间, Read一些参数,调用Read函数(加载文件),然后反序列化完成。 序列化工作很好,但反序列化( List )不起作用,因为反序列化器调用父存根Read文件函数而不是ABCFile或XYZFile 。 如何让反序列化识别正确使用的对象类型? 我的List可能有多种文件类型。 谢谢 我用来序列化对象的代码: public class InputFileHolder : IXmlSerializable { … public void WriteXml(XmlWriter w) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(“”, “”); XmlSerializer ifXml = new XmlSerializer(typeof(List)); ifXml.Serialize(w, InputFiles, ns); //More serialization } 我自定义序列化List时如何维护对象类型的任何想法?

C#Custom Observable Collection – 我应该使用Composition还是inheritance?

我想创建一个自定义的可观察集合(可以绑定到XAML中),但我想跟踪需要覆盖可观察集合方法的其他信息。 ObservableCollection方法不是虚拟的 ,这意味着“覆盖”它们的唯一方法实际上就是使用’new’关键字隐藏它们。 这是我的意思的一个简单例子: //Tracks how many objects of each type are in this collection class CustomCollectionInherited:ObservableCollection { private Dictionary _count = new Dictionary(); public UInt32 getTypeCount(Type T) { return _count[T]; } #region Base Method ‘Overrides’ new public void Add(Object item) { base.Add(item); if (!_count.ContainsKey(item.GetType())) { _count[item.GetType()] = 1; } else { _count[item.GetType()] += 1; […]

在我的Paint程序中绘制矩形时出错

public partial class Form1 : Form { Point downPoint , upPoint; List shapes = new List(); public ShapesEnum shapeType; public Form1() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); foreach (var s in shapes) s.Draw(e.Graphics); } protected override void OnMouseDown(MouseEventArgs e) { downPoint = e.Location; } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); […]

C#inheritance:静态与非静态字段

我有一个库基类( Controller )和三个inheritance自Controller ( Sensor , Output和Environment )的子类,其中: public class Controller { private SerialPort serial; private Sensor sensorSettings; private Output outputSettings; private Environment environmentSettings; protected Dictionary ErrorDescriptions { get{ this.errorDescriptions; } } protected SerialPort ControllerSerialPort { get{ this.serial; } } protected Sensor SensorSettings { get{ this.sensorSettings; } } // The other sub-class get properties. protected […]

忽略entity framework代码中的基类型也会忽略子类吗?

我正在尝试模拟一个场景,在这个场景中,我从第三方库中的具体基类inheritance,然后使用Entity Framework Code First映射我自己的类。 我更希望我的类具有与基类相同的简单名称。 我显然不能更改基类的类名,也不能将基类更改为抽象。 正如所料,我收到以下错误: 类型’EfInheritanceTest.Models.Order’和类型’EfInheritanceTest.Models.Base.Order’都具有相同的简单名称’Order’,因此不能在同一模型中使用。 给定模型中的所有类型都必须具有唯一的简单名称。 使用“NotMappedAttribute”或在Code First Fluent API中调用Ignore,以从模型中明确排除属性或类型。 据我所知,在EF6中,只要实际映射了其中一个类,就可以实现。 但是,如果我尝试使用流畅的API忽略基类,我会收到以下错误: 未映射“EfInheritanceTest.Models.Order”类型。 使用Ignore方法或NotMappedAttribute数据批注检查未明确排除类型。 validation类型是否已定义为类,不是原始类型还是通用类型,并且不从EntityObjectinheritance。 …这似乎表明通过忽略基类,我也忽略了任何子类。 完整代码如下。 有什么方法可以解决这个问题并且“unignore”这个子类? 或者这是EF类型映射的限制? namespace EfInheritanceTest.Models.Base { public class Order { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual decimal Amount { get; set; } } } […]

通过reflection确定派生类

我想处理从类A派生的类的方法。类A和派生类驻留在不同的程序集中。 我使用reflection从派生的程序集中获取所有System.Type并迭代它们的方法。 Assembly A: class Template {…} Assembly B: class X: A.Template {…} Assembly B: class Y: A.Template {…} Assembly B: class Z: A.Template {…} 当我尝试在程序集B迭代类X的方法时,它包含了类A所有方法。 我想要实现的只是遍历派生类中存在的那些方法。 我认为在不同的程序集中根本不重要,但即使我尝试根据程序集过滤方法的声明类型,它也不起作用。 我已经尝试使用MethodInfo对象的各种属性,但无法过滤掉它。 我确信我错过了一些愚蠢的检查,但一直在努力解决这个问题。 任何意见,将不胜感激。