C#问题中的inheritance – 是否可能覆盖内部方法?

是否可以覆盖内部方法的行为?

using System; class TestClass { public string Name { get { return this.ProtectedMethod(); } } protected string ProtectedMethod() { return InternalMethod(); } string InternalMethod() { return "TestClass::InternalMethod()"; } } class OverrideClassProgram : TestClass { // try to override the internal method ? (doesn't work) string InternalMethod() { return "OverrideClassProgram::InternalMethod()"; } static int Main(string[] args) { // TestClass::InternalMethod() Console.WriteLine(new TestClass().Name); // TestClass::InternalMethod() ?? are we just screwed? Console.WriteLine(new OverrideClassProgram().Name); return (int)Console.ReadKey().Key; } } 

我觉得你这里有些困惑。 有一个实际的关键词“内部”,这是你想要的吗?

 internal string InternalMethod() { return "TestClass::InternalMethod()"; } 

但我认为你真正想要的是“虚拟”关键词。 这允许您执行覆盖:父类

 protected virtual string InternalMethod() { return "TestClass::InternalMethod()"; } 

儿童class

 protected override string InternalMethod() { return "TestProgram::InternalMethod()"; } 

使用“new”关键字是有效的,但它完全重新实现了该方法。 即它打破了多态性。

编辑:这是一个链接 。

在Java中,除非是静态/最终的,否则一切都是虚拟的。 在C#中,您必须将实例方法显式声明为virtual,然后该方法不能是私有的。 本文解释了原因。

默认情况下,类的所有成员都是私有的,因此如果您不提供访问修饰符(当然不是私有 ,示例中的InternalMethod()方法是私有的,不能是虚拟的,因此无法覆盖。

您必须更改它的访问修饰符并将其标记为虚拟,并且在子类中必须覆盖它以使代码按您希望的方式工作。

这可能无法解答您的问题,只是为了增加一分钱。

Internal表示只能在同一程序集中的文件中访问类型或成员。 他们是集会的公众,但实际上访问量略低于public

MSDN 访问修饰符 ,

内部访问的一个常见用途是基于组件的开发,因为它使一组组件能够以私有方式进行协作,而不会暴露给其他应用程序代码。 例如,用于构建图形用户界面的框架可以提供使用具有内部访问权限的成员进行协作的Control和Form类。 由于这些成员是内部成员,因此不会向使用该框架的代码公开

尝试使用override关键字… new关键字是调用类构造函数

当然,这是可能的,但是为了覆盖方法,该方法需要是virtualabstract ,与任何其他可见性相同。

 class Base { internal virtual void Foo() { Console.WriteLine("Foo from Base"); } } class Derived : Base { internal override void Foo() { Console.WriteLine("Foo from Derived"); } } 

当你使用new关键字时,它被称为方法隐藏 ,这不是一回事。 如果我写这个:

 class Base { internal void Foo() { Console.WriteLine("Foo from Base"); } } class Derived : Base { internal new void Foo() { Console.WriteLine("Foo from Derived"); } } static void Main() { Base b = new Derived(); b.Foo(); } 

然后它将执行Base Foo方法,而不是Derived 。 换句话说,它将Foo from Base打印Foo from Base 。 在第一种情况下,它仍然会执行Derived方法并Foo from Derived打印Foo from Derived