О C # и Наследовании - PullRequest
       7

О C # и Наследовании

5 голосов
/ 02 сентября 2011

У меня есть теоретический / практический вопрос о том, как наследование работает в C #.

Допустим, мне нужно смоделировать некоторые автомобили, поэтому у меня есть несколько общих методов, которые должны реализовывать все автомобили, и пилот должензнать.В кодовых словах это должен быть интерфейс:

interface Automobile {
   void speedup();
   void break();
   void steer();
   //bla bla
}

Теперь у всех видов автомобилей должны быть общие технические реализации, помимо действий, которые пилот может выполнять над ними, скажем, свойство fuelLevel, в этомЯ до сих пор не хочу знать, как автомобиль ускоряется или ломается, поэтому я написал бы:

 abstract class Car : Automobile {
    int fuelLevel;    // for example....
    public abstract void speedup();
    public abstract void break();
    public abstract void steer();
 }

Теперь я хочу смоделировать Ferrari, поэтому:

class Ferrari : Car {
    public void speedup() { ... }
    public void break() { ... }
    public void steer() { ... }
}

Теперь в Java этот код должен работать (изменяя некоторый синтаксис), но в C # - нет, потому что он говорит:

Error   1   'Ferrari' does not implement inherited abstract member 'Car.speedup()'
Error   1   'Ferrari' does not implement inherited abstract member 'Car.break()'
Error   1   'Ferrari' does not implement inherited abstract member 'Car.steer()'

Почему?Как мне решить эту проблему?

Ответы [ 3 ]

16 голосов
/ 02 сентября 2011

Вам нужно пометить методы override, чтобы охватить определения abstract ниже:

class Ferrari : Car 
{
    public override void speedup() { }
    public override void break() { }
    public override void steer() { }
}

Кроме этого, вы настроены - класс Ferrari удовлетворит ваш интерфейс, даже если методы получены. Кроме того, наименование в C # немного отличается:

  • Префиксные интерфейсы с I, IAutomobile.
  • Прописные буквы по методам: Speedup(), Break(), Steer().
3 голосов
/ 02 сентября 2011

Вы фактически игнорируете переопределение абстрактных членов класса.Попробуйте рассмотреть что-то вроде:

interface IAutomobile
{
    void Steer();
    void Break();
}

abstract class Car : IAutomobile
{
    public abstract void Steer();
    public abstract void Break();
}

class Ferrari : Car
{
    public override void Steer()
    {
        throw new NotImplementedException();
    }

    public override void Break()
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 02 сентября 2011

хорошо, метод "disconnetti" (вы итальянский?) Нигде не написан, поэтому вы должны прежде чем объяснить нам, откуда это.

Во-вторых, в C # при переопределении абстрактного метода вы должны явно указать его через ключевое слово override

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