Tag: 覆盖

C#基类方法使用的成员变量覆盖

好的,所以我承认这是有点棘手……但它确实有逻辑作用。 我正在使用C#作为当前项目,我试图找到一种方法来覆盖派生类中的成员变量,但是在基类方法中访问重写的变量。 为了使事情更“有趣”,最好是被覆盖的成员变量是静态的(这在下面的示例代码中没有显示)。 这是我的示例代码: class baseclass { protected string[] array = null; public string method() { string str = “”; foreach (string x in this.array) { str += x + ” “; } return str; } } class subclass1 : baseclass { new string[] array = new string[] { “class1value1”, “class1value2”, “class1value3”, “class1value4” }; } […]

实现后密封接口

我正在做一个小项目,我遇到了这个问题。 项目输出是包含接口的库。 我希望实现该接口并尽可能密封其中的函数: public interface ITest { void SomeMethod(); } class A : ITest { public sealed override SomeMethod() { } } 我们的想法是让每个人都可以使用该界面,并拥有一些实现它的专门类。 例外情况是,我想确保如果某人创建了类型A的专用类,他/她将无法更改方法的行为。 问题是您不能在其中放置“override”关键字,因为该方法未在界面中声明为“虚拟”。 并且您不能在接口中将其声明为“虚拟”,因为它是不允许的。 并且您无法删除“override”关键字,因为“密封”需要它。 任何变通方法或头脑风暴的想法都会受到欢迎,但如果有人能想出一个包含界面的解决方案,我真的很乐意学习它! 谢谢! 编辑:忘了这个问题! 就像Ani说的那样,我忘了默认C#中的方法是密封的。 似乎偶尔回到基础知识总是好的…

使用更多指定的返回类型覆盖抽象属性(协方差)

class Base {} abstract class A { abstract public List Items { get; set; } } class Derived : Base {} class B : A { private List items; public override List Items { get { return items; } set { items = value; } } } 编译器说B.Items必须是Base元素列表“匹配重写成员”A.Items。 我怎样才能做到这一点?

当一个属性隐藏带有’new’关键字的inheritance成员时,reflection如何告诉我?

如果我有: public class ChildClass : BaseClass { public new virtual string TempProperty { get; set; } } public class BaseClass { public virtual string TempProperty { get; set; } } 如何使用reflection来查看ChildClass是否隐藏了TempProperty的Base实现? 我想在c#和vb.net之间做出不可知的答案

C#:在ProgressBar上覆盖OnPaint不起作用?

认为创建一个自己绘制一些文本的ProgressBar应该很容易。 但是,我不太清楚这里发生了什么…… 我添加了以下两个覆盖: protected override void OnPaintBackground(PaintEventArgs pevent) { base.OnPaintBackground(pevent); var flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis; TextRenderer.DrawText(pevent.Graphics, “Hello”, Font, Bounds, Color.Black, flags); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis; TextRenderer.DrawText(e.Graphics, “Hello”, Font, Bounds, Color.Black, flags); } 但是,我没有文本,甚至似乎都没有调用这些方法。 这里发生了什么? 更新:感谢到目前为止的两个答案,我已经通过使用SetStyle(ControlStyles.UserPaint, true)来实际调用OnPaint […]

如何使用C#中的setter覆盖仅限getter的属性?

更新 :此问题已经过修改,以使其更加清晰。 下面的答案似乎反映出这种方法效果很好。 希望这个问题可以帮助那些需要添加get或set to existing property的人。 今天遇到一个问题,我需要用get和set来覆盖基类的get -only属性。 目前的共识似乎是这是不可能的,但我认为我找到了一种方法。 一般的想法是创建一个new属性而不是直接override旧属性,然后我们创建一个桥接方法, override调用新的方法override旧的get方法。 情况 这是一些无法修改的任意预先存在的类型结构的代码。 public abstract class A { public abstract int X { get; } } public class B : A { public override int X { get { return 0; } } } 问题 我们想编写这段代码,但不会编译。 public class C : B // won’t compile: […]

C#覆盖公共成员并将其设为私有

可能? 你能改变任何 东西的访问权限吗?

确保在C#中调用基本方法

我可以以某种方式强制派生类始终调用重写的方法基础? public class BaseClass { public virtual void Update() { if(condition) { throw new Exception(“…”); // Prevent derived method to be called } } } 然后在派生类中: public override void Update() { base.Update(); // Forced call // Do any work } 我搜索过并发现了一个使用非虚拟Update()的建议,还有一个受保护的虚拟UpdateEx()。 它只是感觉不是很整洁,有没有更好的方法? 我希望你能得到这个问题,我很抱歉任何不好的英语。

C#Virtual和Override的内部工作原理

关于C#虚拟和覆盖机制如何在内部工作的主题已经被程序员讨论过死亡……但是在谷歌上半小时之后,我找不到以下问题的答案(见下文): 使用简单的代码: public class BaseClass { public virtual SayNo() { return “NO!!!”; } } public class SecondClass: BaseClass { public override SayNo() { return “No.”; } } public class ThirdClass: SecondClass { public override SayNo() { return “No…”; } } class Program { static void Main() { ThirdClass thirdclass = new ThirdClass(); string a = […]

在没有不可变字段的类中重写Object.GetHashCode()时要返回什么?

好吧,在你因为互联网上发布了数百个类似的声音问题而疯狂之前,我可以向你保证,我刚刚花了最后几个小时阅读所有这些问题并且没有找到我的问题的答案。 背景: 基本上,我的一个大型应用程序遇到了ListBox.SelectedItem属性上的某些Binding将停止工作或者在对当前所选项目进行编辑后程序崩溃的情况。 我最初问过“已经添加了相同密钥的项目”这里从代码问题中选择ListBoxItem的例外 ,但没有得到答案。 直到本周,我才有时间解决这个问题。 现在简而言之,我找到了问题的原因。 这是因为我的数据类型类已经覆盖了Equals方法,因此也覆盖了GetHashCode方法。 现在对于那些不知道这个问题的人,我发现你只能使用不可变字段/属性来实现GetHashCode方法。 使用Harvey Kwok对Overriding GetHashCode()post的回答来解释这个: 问题是Dictionary和HashSet集合正在使用GetHashCode将每个项目放在存储桶中。 如果基于某些可变字段计算哈希码,并且在将对象放入HashSet或Dictionary后实际更改了字段,则无法再从HashSet或Dictionary中找到该对象。 所以实际问题是因为我在GetHashCode方法中使用了可变属性。 当用户在UI中更改了这些属性值时,对象的关联哈希码值发生了更改,然后在其集合中找不到项。 题: 所以,我的问题是处理我需要在没有不可变字段的类中实现GetHashCode方法的情况的最佳方法是什么? 对不起,让我更具体一点,因为之前已经提出了这个问题。 Overriding GetHashCode()post中的答案表明,在这些情况下,最好只返回一个常量值……有些建议返回值1 ,而其他建议返回素数。 就个人而言,我看不出这些建议之间有什么区别,因为我原本以为只会有一个桶用于其中任何一个。 此外,Eric Lippert博客中关于GetHashCode的指南和规则有一个标题为指南的部分:哈希码的分布必须是“随机的” ,这突出了使用导致使用不足的桶的算法的缺陷。 他警告说,算法会减少使用的桶数,并在桶变得非常大时导致性能问题 。 当然,返回常数属于这一类。 我想到了为我的所有数据类型类(仅在C#中,而不是数据库中)添加一个额外的Guid字段,特别是在GetHashCode方法中使用。 所以我想在这个长篇介绍的最​​后,我的实际问题是哪个实现更好? 总结一下: 摘要: 在没有不可变字段的类中重写Object.GetHashCode()时,最好从GetHashCode方法返回一个常量,还是为每个类创建一个额外的readonly字段,仅用于GetHashCode方法? 如果我应该添加一个新字段,它应该是什么类型,我不应该将它包含在Equals方法中? 虽然我很高兴收到任何人的答复,但我真的希望得到高级开发人员的答案,他们对这个主题有充分的了解。