Невозможно изменить модификаторы доступа при переопределении «открытого» унаследованного члена » - PullRequest
0 голосов
/ 17 мая 2018

Я хочу сделать adapter шаблон.
Ошибка в AutoToTravelAdapter Move ();метод Как я могу override и inherit транспортный метод?Я пытаюсь использовать виртуальный, но он не работает.Я переключаю на 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();
        }
    }
}

1 Ответ

0 голосов
/ 17 мая 2018

Название очень ясно - переопределенный метод должен соответствовать виртуальному методу, который он переопределяет, не только по своей подписи (имени и параметрам), но также по модификаторам доступа и типу возвращаемого значения.
Зачем? из-за (как минимум) полиморфизма и правил перегрузки методов.

Полиморфизм, который является базовым принципом объектно-ориентированного программирования, - это, по сути, способность смотреть на производный класс, как если бы он был его базовым классом. Это означает, что если у базового класса есть метод, подобный 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.
Очевидно, это сделало бы невозможным вызов метода Move() из класса AutoToTravelAdapter, поскольку компилятор не мог бы различить эти два метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...