C #: Наследовать от логического? - PullRequest
4 голосов
/ 13 мая 2011

(как) я могу наследовать от логического? (Или сделайте мой класс сравнимым с логическим с помощью оператора '=')

class MyClass : Boolean
{
    public MyClass()
    {
        this = true;
    }
}
class Program
{
    public Program()
    {
        MyClass myClass = new MyClass();
        if(myClass == true)
            //do something...
        else
            //do something else...
    }
}

Ответы [ 6 ]

10 голосов
/ 13 мая 2011

Вы не можете.System.Boolean - это структура, и вы не можете получить ее из структур.

Теперь, почему вы хотите сделать это, точно?Что является более важной целью?

Вы могли бы включить неявный оператор преобразования из вашего класса в bool, но лично я бы не стал.Я почти всегда предпочитаю выставлять собственность, поэтому вы пишете:

if (myValue.MyProperty)

... Я думаю, что все ясно.Но если бы вы могли дать нам больше реального контекста, мы могли бы дать более конкретный совет.

6 голосов
/ 13 мая 2011

Простой пример:

public class MyClass {
    private bool isTrue = true;

    public static bool operator ==(MyClass a, bool b)
    {
        if (a == null)
        {
            return false;
        }

        return a.isTrue == b;
    }

    public static bool operator !=(MyClass a, bool b)
    {
        return !(a == b);
    }
}

где-то в коде вы можете сравнить ваш объект с логическим значением:

MyClass a = new MyClass();
if ( a == true ) { // it compares with a.isTrue property as defined in == operator overloading method
   // ...
}
2 голосов
/ 14 мая 2011

Вы можете использовать оператор неявного преобразования, чтобы иметь этот код:

class MyClass {
  public bool Value { get; set; }
  public MyClass() {
    Value = true;
  }
  public static implicit operator bool(MyClass m) {
    return m != null && m.Value;
  }
}

class Program {
  public static void Main() {
    var myClass = new MyClass();
    if (myClass) { // MyClass can be treated like a Boolean
      Console.WriteLine("myClass is true");
    }
    else {
      Console.WriteLine("myClass is false");
    }
  }
}

Его можно использовать, как указано выше:

if (myClass) ...

Или вот так:

if (myClass == true) ...
0 голосов
/ 14 мая 2011

Если вы хотите использовать свое значение в операторах if, определите operator true и operator false (вместе с операторами & и |, если вы хотите использовать&& и ||.) ( VB-эквиваленты )

Чтобы ответить больше, мне нужно знать, что вы пытаетесь сделать (другими словами, почему бы просто не использоватьbool напрямую?)

0 голосов
/ 13 мая 2011

Вы можете ("или сделать мой класс сопоставимым ..."), переопределив оператор ==. Я полагаю, что Джон Скит упустил из виду эту часть вопроса.

0 голосов
/ 13 мая 2011

хотя ваш пример не сработает, вы можете сделать что-то похожее для ваших собственных классов, чтобы проверить, равно ли одно значению другого.

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

public static bool operator ==(ThreeDPoint a, ThreeDPoint b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

public static bool operator !=(ThreeDPoint a, ThreeDPoint b)
{
    return !(a == b);
}
...