两个 类 或接口之间的独占签约
Exclusive contracting between two classes or interfaces
我想知道是否可以定义一个方法或 属性 只有指定 类 才能与之交互或查看。
例如:
class Thing
{
protected int i;
public virtual int I
{
get
{
return i;
}
}
}
class OtherThing
{
public virtual void ChangeI(Thing thing, int i)
{
thing.i = i;
}
}
在这里,我希望 OtherThing 能够访问 i,或受保护的 set 方法 I 在 Thing 中,尽管定义在 Thing 的范围之外.
我认识到我可以简单地在 Thing[= 的范围内声明 OtherThing 40=],然后将有权访问受保护的项目,但是我也希望它能与接口一起使用,其实现不能在原始接口的范围内定义,并且谁不能声明受保护无论如何方法。
这可能不太可能,但我很想听听类似的方法来实现同样的事情,这样我就可以自己做一些实验。
提前致谢。
您可能正在 C# 中寻找来自 C++ 的 friend-class 概念。 C# 在 class 级别上没有这样的功能,因此您需要找到另一种设计替代方案。
当我读到这个问题时,它感觉很像一个访问者模式:
http://www.dofactory.com/net/visitor-design-pattern
假设您有一位访客:
class Program
{
static void Main(string[] args)
{
var thing = new Thing();
var otherThing = new OtherThing();
thing.Accept(otherThing);
Console.WriteLine(thing.I);
Console.Read();
}
}
class OtherThing
{
public void Change(Action<int> setI)
{
setI(42);
}
}
class Thing
{
private int i;
public int I { get { return i; } }
public void Accept(OtherThing visitor)
{
visitor.Change(SetI);
}
private void SetI(int i)
{
this.i = i;
}
}
所以这个想法是:当你接受访问者时,你给它一个可以改变你的私人领域的代表。
我不是很明白其中的道理,所以我举的例子很假。无论如何你可以添加接口来抽象事物,甚至使用某种命令来传递而不是动作。但想法会保持不变。
我想知道是否可以定义一个方法或 属性 只有指定 类 才能与之交互或查看。
例如:
class Thing
{
protected int i;
public virtual int I
{
get
{
return i;
}
}
}
class OtherThing
{
public virtual void ChangeI(Thing thing, int i)
{
thing.i = i;
}
}
在这里,我希望 OtherThing 能够访问 i,或受保护的 set 方法 I 在 Thing 中,尽管定义在 Thing 的范围之外.
我认识到我可以简单地在 Thing[= 的范围内声明 OtherThing 40=],然后将有权访问受保护的项目,但是我也希望它能与接口一起使用,其实现不能在原始接口的范围内定义,并且谁不能声明受保护无论如何方法。
这可能不太可能,但我很想听听类似的方法来实现同样的事情,这样我就可以自己做一些实验。
提前致谢。
您可能正在 C# 中寻找来自 C++ 的 friend-class 概念。 C# 在 class 级别上没有这样的功能,因此您需要找到另一种设计替代方案。
当我读到这个问题时,它感觉很像一个访问者模式: http://www.dofactory.com/net/visitor-design-pattern
假设您有一位访客:
class Program
{
static void Main(string[] args)
{
var thing = new Thing();
var otherThing = new OtherThing();
thing.Accept(otherThing);
Console.WriteLine(thing.I);
Console.Read();
}
}
class OtherThing
{
public void Change(Action<int> setI)
{
setI(42);
}
}
class Thing
{
private int i;
public int I { get { return i; } }
public void Accept(OtherThing visitor)
{
visitor.Change(SetI);
}
private void SetI(int i)
{
this.i = i;
}
}
所以这个想法是:当你接受访问者时,你给它一个可以改变你的私人领域的代表。
我不是很明白其中的道理,所以我举的例子很假。无论如何你可以添加接口来抽象事物,甚至使用某种命令来传递而不是动作。但想法会保持不变。