2013-01-14 32 views
1

我想创建一个具有成员函数(例如。giveCharity)的类(例如Person),但我希望该方法的内容对于类的每个实例都是不同的,模仿人工智能。这可能吗?何时以及如何填充每个实例方法的代码?类方法对于类的每个实例都有不同的代码吗?

下面是一个例子:

public class Person 
{ 
    // data members 
    private int myNumOfKids; 
    private int myIncome; 
    private int myCash; 

    // constructor 
    public Person(int kids, int income, int cash) 
    { 
     myNumOfKids = kids; 
     myIncome = income; 
     myCash = cash; 
    } 

    // member function in question 
    public int giveCharity(Person friend) 
    { 
     int myCharity; 
     // This is where I want to input different code for each person 
     // that determines how much charity they will give their friend 
     // based on their friend's info (kids, income, cash, etc...), 
     // as well as their own tendency for compassion. 
     myCash -= myCharity; 
     return myCharity; 
    } 
} 

Person John = new Person(0, 35000, 500); 
Person Gary = new Person(3, 40000, 100); 

// John gives Gary some charity 
Gary.myCash += John.giveCharity(Gary); 
+0

您的意思是,为操作添加一些变化?那么,你总是可以初始化一些参数,比如在构造函数中用随机值同情。 –

回答

5

有浮现在脑海中的两个主要途径:

1)给每个人的委托定义功能:

public Func<int> CharityFunction{get;set;} 

然后你只需要弄清楚如何设置它,确保在使用之前始终设置它。要调用它只是说:

int charityAmount = CharityFunction(); 

2)请Personabstract类。添加一个抽象函数,如int getCharityAmount()。然后创建新的子类型,每个类型提供该抽象函数的不同实现。

至于要使用哪一个,这将取决于具体细节。你有很多不同的函数定义吗?第一个选项花费较少的努力来添加一个新的。对象创建后,函数是否会改变?第二种选择是不可能的,只有第一种。你是否重复使用相同的功能?在这种情况下,第二种选择更好,因此呼叫者不会不断重新定义相同的小部分功能。第二个也有点安全,因为该函数将始终有一个定义,并且您知道一旦创建对象后它不会被更改,等等。

+0

当我读到 –

+0

这是我的直接想法委托财产不是一个好主意,这就是为什么我们有事件。 –

+0

@HenkHolterman当它是一个void返回签名时,这是真的,但是这是不同的,因为需要一个返回值,这意味着重要的是只有一个方法被执行,没有更多,也不少。对于一个事件,你最终只能得到组中的一个方法的返回值,并且你不能控制哪个方法,所以这不是一个理想的选择。 – Servy

0

为什么不通过传递函数对象Charity实现不同giveCharity(Person friend)方法构造Person对象。

然后person.giveCharity(Person friend)可以简单地叫my_charity.giveCharity(friend)

相关问题