覆盖"公共"继承成员时无法更改访问修饰符



我想做adapter模板。
移动()AutoToTravelAdapter中存在错误;方法 如何overrideinherit运输方式?我尝试使用虚拟,但它不起作用。我在两个适配器中都更改为公共覆盖 void Move(),并且有效!谢谢,佐哈尔·佩莱德

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()的方法,则派生类也有此方法 - 要么继承不变,要么在派生类中被重写。

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

想象一下,如果编译器允许您更改继承中的访问修饰符 - 您最终会得到这样的类:

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

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私有方法,另一个从Transport继承的公共方法。
显然,这使得从AutoToTravelAdapter类内部调用Move()方法变得不可能,因为编译器无法区分这两种方法。

最新更新