我想创建一个类(例如,人),并包含一个成员函数(例如,捐赠),但我希望这个方法的内容在每个类的实例中有所不同,以模拟人工智能。这是可能的吗?我应该在什么时候以及如何为每个实例的方法填充代码?
这是一个例子:
public class Person{ // 数据成员 private int myNumOfKids; private int myIncome; private int myCash; // 构造函数 public Person(int kids, int income, int cash) { myNumOfKids = kids; myIncome = income; myCash = cash; } // 问题中的成员函数 public int giveCharity(Person friend) { int myCharity; // 这里我想为每个人输入不同的代码 // 以决定他们将根据朋友的信息(孩子数、收入、现金等) // 以及他们自己的同情倾向,给朋友多少捐赠。 myCash -= myCharity; return myCharity; }}Person John = new Person(0, 35000, 500);Person Gary = new Person(3, 40000, 100);// John给Gary一些捐赠Gary.myCash += John.giveCharity(Gary);
回答:
我想到了两种主要的方法:
1) 为每个人提供一个定义函数的委托:
public Func<int> CharityFunction{get;set;}
然后你只需要弄清楚如何设置它,并确保在使用之前总是设置好。要调用它,只需说:
int charityAmount = CharityFunction();
2) 将Person
设为abstract
类。添加一个抽象函数,如int getCharityAmount()
。然后创建新的子类型,每个子类型提供该抽象函数的不同实现。
至于使用哪种方法,这将更多地取决于具体情况。你有很多不同函数的定义吗?第一种选项添加新函数时需要的努力较少。函数在对象创建后是否会改变?第二种选项不支持这一点,只有第一种选项可以。是否经常重用相同的函数?在这种情况下,第二种选项更好,这样调用者就不会不断地重新定义同一小组函数。第二种方法也更安全,因为函数总是有定义,而且你知道一旦对象创建后它就不会被改变,等等。