インターフェイスがクラスのパブリックプロパティと関数を定義する方法と同様の方法で、クラスの特定の内部プロパティと関数を適切に定義できる有効なユースケースがあるかどうか疑問に思いました。
人間を説明するクラスを構築する必要があるタスクを想像してみてください。
明らかに、各人間はヒューマノイドクリーチャーですが、すべてのヒューマノイドクリーチャーが人間であるとは限らないため、おそらく次のような機能を持つインターフェースIHumanoidがあります(ボディプランをクラスにハードコードすることは役に立たないため)。
public interface IHumanoid {
function get head():IHead;
function get torso():ITorso;
function get leftArm():IArm;
function get rightArm():IArm;
function get leftLeg():ILeg;
function get rightLeg():ILeg;
}
さらに、そして明らかに、各人間は哺乳動物ですが、すべての哺乳動物が人間であるとは限らないため、どこかに浮かぶ男性と女性の2つの定義を持つ別のインターフェイスIMammalがおそらくあります。
public interface IMammal {
function procreate(partner:IMammal):void;
}
public interface IMaleMammal extends IMammal {
function inseminate(female:IFemaleMammal):void;
}
public interface IFemaleMammal extends IMammal {
function conceive(partner:IMaleMammal):Boolean;
function giveBirth():IMammal;
function nurse(offspring:IMammal):void;
}
したがって、クラスはおそらく次のようになります。
public class Human implements IHumanoid, IMammal {
private var _head:IHead;
private var _torso:ITorso;
private var _leftArm:IArm;
private var _rightArm:IArm;
private var _leftLeg:ILeg;
private var _rightLeg:ILeg;
public function Human() {
// ctor...
}
public function get head():IHead {
return _head;
}
public function get torso():ITorso {
return _torso;
}
public function get leftArm():IArm {
return _leftArm;
}
public function get rightArm():IArm {
return _rightArm;
}
public function get leftLeg():ILeg {
return _leftLeg;
}
public function get rightLeg():ILeg {
return _rightLeg;
}
public function procreate(partner:IMammal):void {
// "abstract" function
}
}
public class MaleHuman extends Human implements IMaleMammal {
override public function procreate(partner:IMammal):void {
if (partner is IFemaleMammal) {
inseminate(partner);
}
}
public function inseminate(female:IFemaleMammal):void {
female.conceive(this);
}
}
public class FemaleHuman extends Human implements IFemaleMammal {
override public function procreate(partner:IMammal):void {
if (partner is IMaleMammal) {
conceive(partner);
}
}
public function conceive(partner:IMaleMammal):Boolean {
// ...
}
public function giveBirth():IMammal {
// ...
}
public function nurse(offspring:IMammal):void {
// ...
}
}
これにより、クラスをさらに実装することができ、既存のインターフェースを使用して他のクラスを実装するタスクを取得するまで、すべてが正常に機能します。おそらくゴリラ、シャチ、カモノハシ。
カモノハシが現在のインターフェース構造(*咳*卵を産む哺乳類*咳*)にもたらす大きな問題を無視すると、ゴリラ2脳、シャチ8肺、カモノハシ半分を与えることを妨げるものがない「問題」があります。 1ダースの肝臓。また、哺乳類の構造を理解するのに十分な規律があるかもしれませんが、他の開発者がAPIを開いても、外の世界では問題ないように真剣にねじ込まれたものをコーディングする場合は、同じことを保証できません。
したがって、非公開の関数とプロパティを定義する「プライベートインターフェイス」のようなものを作成するための有効なユースケースがあるかどうか疑問に思いました。おそらくこれらの線に沿った何か:
public structure SMammal {
function get brain():IBrain;
function get liver():ILiver;
function get leftLung():ILung;
function get rightLung():ILung;
function get leftKidney():IKidney;
function get rightKidney():IKidney;
}
public class Human implements IHumanoid, IMammal follows SMammal {
private function get brain():IBrain {
// ...
}
private function get liver():ILiver {
// ...
}
// etc. etc.
}
このような機能はプログラミング言語に存在しますか?抽象クラスを使用してこれを解決できますか?それとも、パブリックインターフェイスが何らかの形で期待どおりに機能している限り、これを気にする必要はありませんか?