覆盖“公共”inheritance成员时无法更改访问修饰符

我想做adapter模板。
AutoToTravelAdapter Move()中存在错误; 方法如何overrideinherit Transport方法? 我尝试使用虚拟但它不起作用。 我更改为公共覆盖void两个适配器中的Move(),这是有效的! 谢谢, Zohar Peled

 using System; namespace Adapter { class Program { static void Main(string[] args) { Traveller traveller = new Traveller(); Transport camelTransport = new CamelToTravelAdapter(); Transport autoTransport = new AutoToTravelAdapter(); traveller.Travel(camelTransport); traveller.Travel(autoTransport); Console.Read(); } } public class Transport { virtual public void Move() { Console.WriteLine("trans Moves"); } } class Auto { public void Drive() { Console.WriteLine("Car drive"); } } class Traveller { public void Travel(Transport transport) { transport.Move(); } } class Camel { public void Move() { Console.WriteLine("Camel Moves"); } } public class CamelToTravelAdapter : Transport { private Camel camel = new Camel(); private new void Move() { camel.Move(); } } public class AutoToTravelAdapter : Transport { private Auto auto = new Auto(); **private override void Move()** { auto.Drive(); } } } 

标题非常清楚 – 覆盖方法必须匹配它覆盖的虚方法,不仅是它的签名(名称和参数),还有它的访问修饰符和返回类型。
为什么? 因为(至少)多态和方法重载规则。

多态性是面向对象编程的基本原则,它基本上是能够查看派生类,就好像它是它的基类一样。 这意味着如果基类具有类似public void move() ,则派生类也具有此方法 – 在派生类中inheritance未更改或重写。

方法重载的规则非常简单 – 您可以使用多个具有相同名称但签名不同的方法。 该方法的签名是它的名称和它的参数的组合 – 因此不允许仅由返回类型或访问修饰符区分的重载。

想象一下,如果编译器允许你在inheritance中更改访问修饰符 – 你最终会得到一个这样的类:

警告:前面的代码不正确!

 public class Transport { public virtual void Move() { Console.WriteLine("trans Moves"); } } public class AutoToTravelAdapter : Transport { private Auto auto = new Auto(); private override void Move() { auto.Drive(); } } 

实际上, AutoToTravelAdapter将具有两个具有相同签名的Move方法 – 一个在AutoToTravelAdapter类中声明的AutoToTravelAdapter ,一个从Transportinheritance的公共。
显然,这将使得从AutoToTravelAdapter类内部调用Move()方法AutoToTravelAdapter不可能,因为编译器无法区分这两种方法。