C# 对于类的每个实例,类方法可以有不同的代码吗?

C# 对于类的每个实例,类方法可以有不同的代码吗?,c#,class,methods,artificial-intelligence,member-functions,C#,Class,Methods,Artificial Intelligence,Member Functions,我想创建一个带有成员函数(如giveCharity)的类(如Person),但我希望该方法的内容对于类的每个实例都是不同的,模仿人工智能。这可能吗?何时以及如何为每个实例的方法填充代码 下面是一个例子: public class Person { // data members private int myNumOfKids; private int myIncome; private int myCash; // constructor pub

我想创建一个带有成员函数(如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);

为什么不通过传入一个函数对象
Charity
来构造
Person
对象,该函数对象实现了不同的
giveCharity(Person friend)
方法


然后,
person.giveCharity(person friend)
可以简单地调用
my\u charity.giveCharity(friend)
为什么不通过传入一个实现不同的
giveCharity(person friend)
方法的函数对象
charity
来构造
person
对象呢


然后,
person.giveCharity(person friend)
可以简单地调用
my_charity.giveCharity(friend)

想到两种主要方法:

1) 给每个人一个定义函数的委托:

public Func<int> CharityFunction{get;set;}
2) 将
Person
变成
抽象类。添加一个抽象函数,如
int getCharityAmount()
。然后创建新的子类型,每个子类型提供该抽象函数的不同实现


至于使用哪一种,这将更多地取决于具体情况。你对函数有很多不同的定义吗?第一个选项添加新选项所需的工作量较小。创建对象后,函数是否会更改?第二种选择是不可能的,只有第一种。你经常重复使用相同的功能吗?在这种情况下,第二个选项更好,这样调用者就不会不断地重新定义相同的一小撮函数。第二种方法更安全一些,因为函数总是有一个定义,并且您知道一旦创建了对象,它就不会被更改,等等。

我们想到了两种主要方法:

1) 给每个人一个定义函数的委托:

public Func<int> CharityFunction{get;set;}
2) 将
Person
变成
抽象类。添加一个抽象函数,如
int getCharityAmount()
。然后创建新的子类型,每个子类型提供该抽象函数的不同实现


至于使用哪一种,这将更多地取决于具体情况。你对函数有很多不同的定义吗?第一个选项添加新选项所需的工作量较小。创建对象后,函数是否会更改?第二种选择是不可能的,只有第一种。你经常重复使用相同的功能吗?在这种情况下,第二个选项更好,这样调用者就不会不断地重新定义相同的一小撮函数。第二个更安全,因为函数总是有一个定义,并且你知道一旦创建了对象,它就不会被更改,等等。

你的意思是,给动作添加一些变化?好吧,你可以在构造函数中用随机值初始化一些参数,比如同情。你的意思是,给动作增加一些变化?好的,你总是可以在构造函数中用随机值初始化一些参数,例如。委托属性不是一个好主意,这就是为什么我们有事件。@HenkHolterman当它是一个无效的返回签名时,这是正确的,但这不同于需要一个返回值,这意味着,重要的是,只执行一个方法,不多不少。对于一个事件,您将只得到组中一个方法的返回值,并且您无法控制其中的一个,因此这不是一个理想的选项。委托属性不是一个好主意,这就是为什么我们有事件。@HenkHolterman当它是一个无效的返回签名时,这是正确的,但这是不同的,因为需要一个返回值,这意味着只执行一个方法很重要,不多也不少。对于一个事件,您最终只能得到组中一个方法的返回值,并且您无法控制该返回值,因此这不是一个理想的选择。