Der Aufruf der Funktion "function" wurde kontextsensitiv. Ich nehme an, dieser Trick kann ausgenutzt werden, um subject-oriented programming zu unterstützen.
Die subjektorientierte Programmierung basiert auf der Beobachtung, dass Eigenschaften eines Objekts dem Objekt selbst nicht innewohnen, sondern davon abhängen, wer dieses Objekt wahrnimmt. Zum Beispiel ist Baum aus der Sicht des Menschen nicht Nahrung, sondern aus der Sicht der Termiten ist Baum Nahrung. Das objektorientierte Paradigma unterstützt diese Beobachtung nicht direkt, und die Menschen kommen oft zu komplexen unnatürlichen Designs, weil sie versuchen, alle verschiedenen subjektiven Ansichten eines Objekts in eine Einheit ("Klasse") einzubauen, indem sie unbedachte OOP-Richtlinien befolgen.
Versuchen wir also, subjektive Wahrnehmungen explizit zu formulieren, indem wir den betreffenden Trick verwenden, um Kontextsensitivität zu erhalten.
template<class FoodSource>
class FoodFrom {};
//forward declarations
class Tree;
class Termite;
class Human;
//property "food" of a tree
template<>
class FoodFrom<Tree>
{
public:
FoodFrom(Tree& _tree): tree(_tree) {}
//termite perception of tree as food
operator FoodFor<Termite>()
{
int happiness_increase = 5;
tree.mass -= 10;
return FoodFor<Termite>(happiness_increase);
}
//human perception of tree as food
operator FoodFor<Human>()
{
int happiness_increase = 0;
return FoodFor<Human>(happiness_increase);
}
private:
Tree& tree;
};
//property "food" of a termite
template<>
class FoodFrom<Termite>
{
public:
FoodFrom(Termite& _termite): termite(_termite) {}
//human perception of termite as food
operator FoodFor<Human>()
{
int happiness_increase = -100;
//apparently, the termite ought to be terminated due to such a violent act
termite.~Termite();
return FoodFor<Human>(happiness_increase);
}
private:
Termite& termite;
};
//simple class FoodFor, just for demonstration purposes
class FoodBase
{
public:
FoodBase(int _value) : value(_value) {}
int value;
};
template<class T>
class FoodFor: public FoodBase
{
public:
FoodFor(): FoodBase(0) {}
FoodFor(int _value) : FoodBase(_value) {}
};
class AliveBeing
{
public:
AliveBeing(): happiness(100) {}
bool is_happy()
{
return happiness > 0;
}
void eat()
{
happiness += getMeal()->value;
}
private:
int happiness;
virtual FoodBase* getMeal() = 0;
};
class Tree: public AliveBeing
{
public:
FoodFrom<Tree> getFood(); //see definition below
float mass;
//...
private:
//we don't call getMeal for a tree in this demo
virtual FoodBase* getMeal() { return NULL; }
};
class Termite: public AliveBeing
{
public:
FoodFrom<Termite> getFood(); //see definition below
FoodFor<Termite> meal;
private:
virtual FoodBase* getMeal() { return &meal; }
};
class Human: public AliveBeing
{
public:
FoodFor<Human> meal;
private:
virtual FoodBase* getMeal() { return &meal; }
};
//return proxy "FoodFrom" to "overload" return type
FoodFrom<Tree> Tree::getFood()
{ return FoodFrom<Tree>(*this); }
FoodFrom<Termite> Termite::getFood()
{ return FoodFrom<Termite>(*this); }
//usage
Tree tree;
Termite funny_bug;
//funny_bug gets its perceived value of eating tree
funny_bug.meal = tree.getFood();
funny_bug.eat();
if(funny_bug.is_happy())
funny_bug.goFindThirdPlace();
//...
Human joel;
//joel get its perceived value of eating tree
joel.meal = tree.getFood();
joel.eat();
//...
if(joel.see(funny_bug))
{
joel.meal = funny_bug.getFood();
joel.eat();
}
if(joel.is_happy())
joel.writeAnotherGreatArticle();
Beachten Sie, dass der Baum nicht weiß, was es isst.
(große Frage in der Tat, hat mich viel darüber nachdenken)
Ich sehe das Problem nicht, wenn es ein "echtes Problem" adressiert. Was ist der Zweck der Funktion sowieso, scheint mir unnötig. – piotr
Nun, es macht Funktion "unnatürlich" Art von verhalten. Ich bin besorgt, wenn es ein Element der Überraschung gibt. – Anycorn
Ich glaube nicht, dass es so verwirrend wäre; Es gibt Sprachen, in denen Funktionen (natürlich) ihr Verhalten basierend auf dem erwarteten Rückgabetyp ändern können, oder (für Sprachen mit mehreren Rückgabewerten) hat die Anzahl der erwarteten Werte –