覆盖“公共”inheritance成员时无法更改访问修饰符
我想做adapter
模板。
AutoToTravelAdapter
Move()中存在错误; 方法如何override
和inherit
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
,一个从Transport
inheritance的公共。
显然,这将使得从AutoToTravelAdapter
类内部调用Move()
方法AutoToTravelAdapter
不可能,因为编译器无法区分这两种方法。