我想知道如何迫使一个变量始终指向另一个变量所指向的对象。
考虑以下程序:
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/