D: Как создать обязательный метод с произвольными параметрами в \ abstract классе? - PullRequest
0 голосов
/ 20 сентября 2018

Скажем, у меня есть абстрактный класс для собаки, определенный следующим образом:

abstract class Dog {
    public:
        uint age;
        abstract void moveDog();
        abstract void feedDog();
        abstract void playFetch();
}

Теперь я хочу создать два различных класса, расширяющих Dog, но методы moveDog, feedDog и playFetch каждый имеют разныереализации и различные аргументы, такие как эти два:

class BigDog: Dog {
    public:
        override void moveDog(uint steps) {...}
        override void feedDog(uint numFoodBowls) {...}
        override void playFetch(uint timeToPlay, float throwDistance) {...}
}

class SmallDog: Dog {
    public:
        override void moveDog(uint steps, float direction) {...}
        override void feedDog(float foodWeight) {...}
        override void playFetch(float throwStrength, uint timeToPlay, float throwDistance) {...}
}

Возможно ли это в D?Я просто хочу заставить все подклассы Dog реализовывать три метода с одинаковыми именами, но я не хочу указывать аргументы и реализации указанных методов.

1 Ответ

0 голосов
/ 24 сентября 2018

Единственный способ, которым вы можете достичь того, что вы хотите, и при этом иметь смысл, - это если вы можете использовать все возможные (общие) параметры и использовать значения по умолчанию.

Я имею в виду следующее.что-то вроде:

import std.stdio;


abstract class Dog {
  public:
  uint age;
  abstract void moveDog(uint steps, float direction=float.nan);
  abstract void feedDog(uint numFoodBowls=-1, float foodWeight=float.nan);
  abstract void playFetch(uint timeToPlay, float throwDistance, float throwStrength=float.nan);
}

class BigDog: Dog {
  public:
  override void moveDog(uint steps, float direction) { 
    writeln(direction);
  }
  override void feedDog(uint numFoodBowls=-1, float foodWeight=float.nan) {}
  override void playFetch(uint timeToPlay, float throwDistance, float throwStrength=float.nan) {}
}

class SmallDog: Dog {
  public:
  override void moveDog(uint steps, float direction) { 
    writeln(direction);
  }
  override void feedDog(uint numFoodBowls=-1, float foodWeight=float.nan) {}
  override void playFetch(uint timeToPlay, float throwDistance, float throwStrength) {}
}

void main() { 
  auto obj = new BigDog();
  obj.moveDog(5, -0.1f); // -0.1
}

Наконец, как отмечали другие, если ваше «поведение» (методы определяют поведение) отличается для каждого «вида» (подкласса) Dog, то оно не должно быть в интерфейсе(абстрактный класс) ...

...