Сравнение типа объекта C#

Да, вы должны перезаписать методы __add__, __mul__ и __repr__:

from PyQt5.QtCore import QPointF

class Point(QPointF):
    def dist(self):
        return (self._p.x() * self._p.x() + self._p.y() * self._p.y()) ** 0.5

    def __add__(self, other):
        return self.__class__(super(self.__class__, self).__add__(other))

    def __mul__(self, other):
        return self.__class__(super(self.__class__, self).__mul__(other))

    def __repr__(self):
        return "{}({}, {})".format(self.__class__.__name__, self.x(), self.y())

if __name__ == '__main__':
    a = Point(1, 2)
    b = Point(2, 3)
    print(a, type(a))
    print(b, type(b))
    print(a + b, type(a + b))
    a += Point(10, 10)
    print(a, type(a))
    a += QPointF(10, 10)
    print(a, type(a))
    print(a*3, type(a*3))
    print("a: {}".format(a))
    l = [a, b]
    print(l)
58
задан B Z 2 April 2009 в 03:55
поделиться

4 ответа

Сказать a и b два объекта. Если Вы хотите видеть если a и b находятся в той же иерархии наследования, затем используют Type.IsAssignableFrom:

var t = a.GetType();
var u = b.GetType();

if (t.IsAssignableFrom(u) || u.IsAssignableFrom(t)) {
  // x.IsAssignableFrom(y) returns true if:
  //   (1) x and y are the same type
  //   (2) x and y are in the same inheritance hierarchy
  //   (3) y is implemented by x
  //   (4) y is a generic type parameter and one of its constraints is x
}

Если Вы хотите проверить, являетесь ли Вы базовым классом другого, то попробуйте Type.IsSubclassOf.

Если Вы знаете определенный базовый класс, то просто используют is ключевое слово:

if (a is T && b is T) {
  // Objects are both of type T.
}

Иначе необходимо будет обойти иерархию наследования непосредственно.

86
ответ дан John Feminella 24 November 2019 в 18:47
поделиться

Существует определенная проблема с этой идеей, тем не менее, поскольку каждый объект (и, действительно, каждый тип) ДЕЙСТВИТЕЛЬНО имеет общий базовый класс, Объект. То, что необходимо определить, - то, как далеко цепочка наследования, Вы хотите пойти (является ли это, они - или то же или у них есть тот же непосредственный родитель, или каждый - непосредственный родитель другого, и т.д.), и сделайте свои проверки тот путь. IsAssignableFrom полезно для определения, если типы совместимы друг с другом, но не полностью установят, если у них есть тот же родитель (если это - то, что Вы после).

Если Ваши строгие критерии - то, что функция должна возвратить true если...

  • Типы идентичны
  • Один тип является родителем (непосредственный или иначе) другого
  • Два типа имеют того же непосредственного родителя

Вы могли использовать

private bool AreSame(Type a, Type b) 
{
    if(a == b) return true; // Either both are null or they are the same type

    if(a == null || b == null) return false; 

    if(a.IsSubclassOf(b) || b.IsSubclassOf(a)) return true; // One inherits from the other

    return a.BaseType == b.BaseType; // They have the same immediate parent
}
32
ответ дан Adam Robinson 24 November 2019 в 18:47
поделиться

Можно также использовать "," ключевое слово, если Вы ожидаете, что эти два экземпляров объектов будут иметь определенный тип. Это будет также работать на сравнение подклассов к родительским классам и также классам та реализация интерфейсы и т.д. Это не будет работать на типы Типа типа все же.

if (objA Is string && objB Is string)
// they are the same.

public class a {}

public class b : a {}

b objb = new b();

if (objb Is a)
// they are of the same via inheritance
13
ответ дан James 24 November 2019 в 18:47
поделиться

Я испытал следующее с иерархией с помощью и интерфейсов и реальных классов. Это идет по цепочке базового класса для одного из типов, пока это не достигает "объекта", в котором мы проверяем, является ли текущий целевой тип присваиваемым исходному типу. Мы также проверяем, имеют ли типы единый интерфейс. если они делают затем их 'AreSame'

Надеюсь, это поможет.

 public interface IUser
{
     int ID { get; set; }
     string Name { get; set; }
}

public class NetworkUser : IUser
{
    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}

public class Associate : NetworkUser,IUser
{
    #region IUser Members

    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    #endregion
}

public class Manager : NetworkUser,IUser
{
    #region IUser Members

    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    #endregion
}


public class Program
{

    public static bool AreSame(Type sourceType, Type destinationType)
    {
        if (sourceType == null || destinationType == null)
        {
            return false;
        }

        if (sourceType == destinationType)
        {
            return true;
        }

        //walk up the inheritance chain till we reach 'object' at which point check if 
    //the current destination type is assignable from the source type      
    Type tempDestinationType = destinationType;
        while (tempDestinationType.BaseType != typeof(object))
        {
            tempDestinationType = tempDestinationType.BaseType;
        }
        if( tempDestinationType.IsAssignableFrom(sourceType))
        {
            return true;
        }

        var query = from d in destinationType.GetInterfaces() join s in sourceType.GetInterfaces()
                    on d.Name equals s.Name
                    select s;
        //if the results of the query are not empty then we have a common interface , so return true 
    if (query != Enumerable.Empty<Type>())
        {
            return true;
        }
        return false;            
    }

    public static void Main(string[] args)
    {

        AreSame(new Manager().GetType(), new Associate().GetType());
    }
}
2
ответ дан Abhijeet Patel 24 November 2019 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: