我想知道如何迫使一个变量始终指向另一个变量所指向的对象。

考虑以下程序:

using System;

public class Program
{
    public static void Main()
    {
        Person p = new Person{Name = "Aelphaeis", Age = -1};
        p.introBehavior.Introduce();
    }

    class Person
    {
        public String Name { get;set; }
        public Int32 Age { get;set; }

        public IIntroductionBehavior introBehavior{get;set;}

        public Person(){
            Name = "over";
            Age = 9000;

            introBehavior = new IntroductionBehavior(Name, Age);
        }
    }

    class IntroductionBehavior : IIntroductionBehavior
    {
        String Name;
        Int32 Age;

        public IntroductionBehavior(string  name, int age){
            Age = age;
            Name = name;
        }

        public void Introduce(){
            Console.WriteLine("I'm " + Name + " and I am " + Age + " years old");
        }

    }

    interface IIntroductionBehavior
    {
        void Introduce();
    }
}


如果您运行此程序,您将获得


  我结束了,我已经9000岁


所需的行为是,IntroductionBehavior内部的Name和Age指向Person内部的属性值。它应该打印:


  我是Aelphaeis,现年-1岁


如果这不可能,那么我将执行哪种类型的重新设计以确保IntroductionBehavior始终打印Person的值而不会使IntroductionBehavior意识到Person?

编辑:很多人似乎对为什么我不想让IntroductionBehavior Aware of Person感到困惑。

简介实际上旨在对存储库进行操作。变量名称和年龄表示将要操作的存储库。我正在尝试松散耦合,以便易于调试。

最佳答案

IntroductionBehavior参考人:

class IntroductionBehavior : IIntroductionBehavior
{
    private Person person;

    public IntroductionBehavior(Person person){
        this.person = person;
    }

    public void Introduce(){
        Console.WriteLine("I'm {0} and I am {1} years old",
           person.Name, person.Age); // NOTE: use string format
    }
}

class Person
{
    public String Name { get; set; }
    public Int32 Age { get; set; }

    public IIntroductionBehavior introBehavior { get; set; }

    public Person(){
        Name = "over";
        Age = 9000;
        introBehavior = new IntroductionBehavior(this);
    }
}


因此,当您要求IntroductionBehavior进行介绍时,它会及时获得姓名和年龄值或人称。

另一种选择是在属性getter中创建IntroductionBehavior实例,而不是在构造函数中创建它:

  public IIntroductionBehavior introBehavior
  {
     get { return new IntroductionBehavior(Name, Age); }
  }


因此,IntroductionBehavior会在您获取时(而不是创建人时)捕获该人的姓名和年龄值。注意:如果您要在获取introBehavior并引入该信息之前更新其姓名或年龄,则会看到旧数据。

当然,使用IntroductionBehavior类是有争议的。

关于c# - 如何使引用肤浅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24614506/

10-12 18:49