我正在做一个程序,将允许用户从虚拟逻辑门建立数字电路。每个gate都是一个代表特定gate类型的类的实例,例如,下面是和类的外观:
public class andgate
{
public andgate()
{
inputs = new bool[7];
for (int i = 0; i < 7; i++) inputs[i] = true;
output = (inputs[0] && inputs[1] && inputs[2] && inputs[3] && inputs[4] && inputs[5] && inputs[6]);
}
public bool[] inputs;
public bool output;
}每个门都有七个输入端,但并不是所有的输入端都要用到(也就是说,对于一个有三个输入端的门,剩下的四个输入端就是"1“,这是AND的中性元素)。每个输入是对另一个门的输出或对布尔数组(其存储输入向量)的元素的引用,以便由一个门自动生成的信号被发送到下一个门。问题是,我还需要信号在门内动态传输,即,如果AND门中的一个输入信号设置为0,则输出自动为0。因此,当您将一个二进制向量馈送到电路的输入时,它会改变电路的输出值。或者,也许有一种比从单个门构建电路更简单的方法来模拟电路?我需要它来生成测试模式。
发布于 2012-11-23 08:55:16
将output属性设为只读:
public bool output
{
get
{
return inputs.All(i => i);
}
}不需要ANDing所有的输入,只需检查是否有任何输入是假的。
当然,您必须在构造函数中删除对output的赋值。这应该使您的output属性“动态”。
您可能还希望将输入更改为bool?[],以便null值表示没有信号。然后,您必须将输入数组的初始化删除为all true,并将输出返回更改为:
return inputs.All(i => i.GetValueOrDefault(true));在评论中使用Tim S的建议进行编辑
发布于 2012-11-23 09:00:38
为此,您应该使用属性来设置/获取输入,因为您可以在属性中执行额外的计算。你持有的状态变量应该是私有的。
public bool[] Inputs {
set {
inputs = value;
}
}
public bool Output {
get {
return inputs[0] && inputs[1] ...
}
}对于Inputs属性,我会避免这样做,因为公开数组实际上暴露了有关类如何存储内容的信息,为了更好的OOP,应该尽可能避免这样做。例如,ReadOnlyCollection可能更适合。
然而,我会在总体上重新考虑设计,并避免一些随意的#输入,7.你是从哪里得到这个值的?
一种更简单的方法是假设一个门有两个值-A和B,您可以在构造函数或单个属性中为其设置值。
然后,你可以利用二进制逻辑门上的操作是关联的,所以一个AND门接受a,b,c,等同于一个接受a,b的门,将它的输出提供给另一个同样接受c的门。这就是你在实践中构建电路的方式-尽管你需要考虑的是门的延迟。
发布于 2012-11-23 09:03:47
听起来你应该将事件添加到门中,这样当它们的状态改变时,它们就能够通知依赖对象;类似这样:
public class AndGate
{
private bool[] inputs;
private bool output;
public bool[] Inputs
{
get
{
return this.inputs;
}
set
{
this.inputs = value;
UpdateOutput();
}
}
public bool Output
{
get
{
return this.output;
}
}
public AndGate()
{
inputs = new bool[7];
for (int i = 0; i < 7; i++) inputs[i] = true;
UpdateOutput();
}
private void UpdateOutput()
{
bool original = output;
output = true;
for(int i=0; i<inputs.Length; i++)
{
output = output && inputs[i];
}
if (original != output)
{
OnChanged(EventArgs.Empty);
}
}
public event GateStateChangedEventHandler StateChanged;
protected virtual void OnChanged(EventArgs e)
{
if (StateChanged != null)
{
StateChanged(this, e);
}
}
}https://stackoverflow.com/questions/13521837
复制相似问题