2009-04-21 64 views
2

这很难解释我的问题,所以给我一个休息,如果它不是很清楚。编辑属性谁不能设置为真/假同等

我有一些可以在视图中编辑的十个属性。他们大多数是布尔人。这些属性配置测试环境(如可以配置一个属性来显示解决方案)。

现在,问题是如果其他设置为false,则某些属性不能设置为true。没有什么会出问题的,但它是无用的。这就像一个属性将被配置为不显示正确的按钮,另一个显示解决方案。在我们的系统中,如果您无法点击正确的按钮,那么解决方案将永远不会显示。

这种问题有没有名字? 这样的属性是否有名称(就像存在不可变属性一样)? 是否有最佳实践来实施这样的故事?我们可以在视图中对其进行硬编码,但我宁愿有一个通用系统。

+0

这是什么语言? – 2009-04-21 09:32:18

+0

Flex-.NET-SQLServer – 2009-04-21 09:48:34

回答

2

您正在查找的单词是正交性。设置是而不是正交,因为它们不能独立变化。

至于如何处理显示这些属性,完成通用的方式来做到这一点(和你的问题可能不保证这种泛型的编码成本)将是给每个控件引用其他控件的表达式,其中如果完整表达式的计算结果为true(或false),则控件在视图中被禁用。

更容易编码将暴露isDisabled()方法的控制,您可以根据需要重写。下面是一个简短的Java示例,它利用Java匿名类来完成艰苦的工作。它假定已经有一个Control级带booleanValue()吸气剂,它转换成一个布尔值,并且,由于AutoDisabledControl是-控件,它可以作为一个下拉更换了控制:

public class AutoDisabledControl extends Control { 
    public isDisabled() { return false ; } 
    } 

    ..... usage .... 
    // control1 is never disabled 
    final Control1 = new AutoDisabledControl() ; 
    // Control2 is disabled if control1 is false 
    final Control2 = new AutoDisabledControl() { 
    public isDisabled() { return control1.booleanValue() == false; } 
    }; 
    // conntrol 3 is enabled only if control1 and control2 are true 
    final Control1 = new AutoDisabledControl() { 
    public isDisabled() { return ! (
         control1.booleanValue() 
         && control2.booleanValue()) ; 
    }; 

自然在视图的显示中,它检查每个控件的isDisabled(),并禁用那些返回true的控件;当控件的值改变时,视图重新显示。我假设某种MVC模式。

1

您可以使用int或long来存储相关属性,并在设置属性以正确清除无效设置时使用位掩码。这个int或long可以采用标记的枚举形式。

[Flags]private enum BitValues 
{ 
    Bit1 = 1 << 0, //Inclusive 
    Bit2 = 1 << 1, //Exclusive to bit 3 and 4 
    Bit3 = 1 << 2, //Exclusive to bit 2 and 4 
    Bit4 = 1 << 3, //Exclusive to bit 2 and 3 
    ExclusiveBits = Bit2 | Bit3 | Bit4 //All exclusive bits 
} 

private BitValues enValues; 

public bool Bit1 
{ 
    get { return (enValues & BitValues.Bit1) == BitValues.Bit1; } 
    set 
    { 
    //Clear the bit 
    enValues = (enValues^BitValues.Bit1) & enValues; 

    //Set the bit 
    enValues = enValues | BitValues.Bit1; 
    } 
} 

public bool Bit2 
{ 
    get { return (enValues & BitValues.Bit2) == BitValues.Bit2; } 
    set 
    { 
    //Clear exclusive bits 
    enValues = (enValues^BitValues.ExclusiveBits) & enValues; 

    //Set bit 
    enValues = enValues | BitValues.Bit2; 
    } 
} 
1

你可以很好地解决你的问题。

尝试以不同的方式思考 - 也许U可以消除一些参数,可以从其他参数中推断出来,或者可以使用激励将几个参数合并为一个参数。

调查你的参数的价值空间来找出它。

+0

的确,我也在朝这个方向思考。但并不那么简单。如果A是真的,那么它可能是B可能是真的和假的。如果A是假的,那么B只能是假的。如果将A设置为true,则当A更改为False时,是否自动更改B?或者你显示一个错误,说明当B为真时A不能是错误的... – 2009-04-21 10:51:50

相关问题