C# 重写';时无法更改访问修饰符;公共';继承成员';
我想做C# 重写';时无法更改访问修饰符;公共';继承成员';,c#,overriding,adapter,C#,Overriding,Adapter,我想做适配器模板。 autototravelapterMove()中有错误;方法 我如何覆盖和继承传输方法?我尝试使用虚拟机,但它不起作用。我在两个适配器中都更改为public override void Move(),这样就行了!谢谢,佐哈尔·佩利德 using System; namespace Adapter { class Program { static void Main(string[] args) { T
适配器模板。
autototravelapter
Move()中有错误;方法
我如何覆盖
和继承
传输方法?我尝试使用虚拟机,但它不起作用。我在两个适配器中都更改为public override 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
类中声明的private,另一个是从Transport
继承的public
显然,这将使从AutoToTravelAdapter
类内部调用Move()
方法变得不可能,因为编译器无法区分这两种方法。标题非常清楚-重写方法必须与它重写的虚拟方法相匹配,而不仅仅是通过它的签名(名称和参数),但也取决于它的访问修饰符和返回类型。好的,我真的不明白。它都返回void()好的,我在两个适配器中都更改为public override void Move(),这很有效!IZohar,你解决了我的问题!好的,谢谢!我想这一定是私有的,因为2 publc可能会冲突。我误解了。很高兴帮助:-)