Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重写';时无法更改访问修饰符;公共';继承成员';_C#_Overriding_Adapter - Fatal编程技术网

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可能会冲突。我误解了。很高兴帮助:-)