D:如何在\抽象类中创建具有任意参数的必需方法?

D:如何在\抽象类中创建具有任意参数的必需方法?,d,D,假设我有一个狗的抽象类,定义如下: abstract class Dog { public: uint age; abstract void moveDog(); abstract void feedDog(); abstract void playFetch(); } 现在我想创建两个不同的类来扩展Dog,但是moveDog、feedDog和playFetch方法都有不同的实现和参数,例如: class BigDog:

假设我有一个狗的抽象类,定义如下:

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的所有子类实现三个同名的方法,但我不想指定所述方法的参数和实现。

实现所需且仍有一定意义的唯一方法是,如果您能够提出所有可能的(公共)参数,并使用默认值

我的想法是:

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
}

最后,正如其他人所指出的,如果您的“行为”(方法定义行为)对于狗的每一种“种类”(子类)都是不同的,那么它不应该在接口(抽象类)中。

具有不兼容参数的接口有什么意义?我的意思是,你想要实现什么,为什么需要强迫?我有一些想法,但需要知道为什么选择最好的lol@AdamD.Ruppe因为我想确保Dog的所有子类都有一个feedDog()方法实现,但是所述方法的每个子类实现可能有不同的参数。也许这样做没有意义。当然,狗的例子只是一个例子。是的,从面向对象的角度来看,这没有任何意义,因为它们之间的接口不兼容。但是你可以通过做一个
静态断言(hassmember,SmallDog,“feedDog”)。某种程度上。。。