Question

Il est vrai dans .NET tous types héritent de System.Object.

Ce que je trouve paradoxal, est quelques méthodes sur System.Object - à savoir

  • virtuel public string ToString ();
  • public virtuel bool equals (Object objA, objet objB);

System.String est héritée de System.Object:

[Serializable]
public class String : Object { /*...*/ }

System.Boolean est héritée de System.Object:

[Serializable]
public struct Boolean : Object { /*....*/ }

Quel est le passe sous les couvertures qui ont permis à la classe System.Object pour permettre sous-classes à utiliser comme types de retour sur ses méthodes? Comment avez ce code jamais compilé, car il semble y avoir une référence circulaire. Chaîne <-> Object <->. Boolean

Je suis sûr que je vais voir les déclarations, sur « thats comment il est mis en œuvre », mais je peux comprendre si ces types de retour étaient « System.Object » eux-mêmes de, puis une sous-classe utilisé les implemenations de chaîne , bool et d'autres System.ValueTypes de déclarer nouveau classe de base.

J'espère que le bon sens.

Merci à l'avance,

Dominic

Était-ce utile?

La solution

Il est pas une grosse affaire, une classe de base peut toujours faire référence à des sous-classes. Par exemple, ce code est parfaitement légal:

class A
{
    public B CreateB();
    {
        return new B();
    }
}

class B : A
{
}

Notez que serait être un problème si A et B ont été définis dans les assemblées distinctes, car cela nécessiterait une référence d'assemblage circulaire, ce qui est interdit

Autres conseils

Une référence circulaire est seulement un problème sur plusieurs projets, sinon relation parent / enfant ne jamais exister des deux côtés soit.

En fait, il est pas tout à fait vrai que tous les types héritent de l'objet. S'il vous plaît voir le sur cette .

Je ne vois pas le problème d'une classe de base de retour d'une classe dérivée.

De plus, je ne vois pas les dépendances circulaires depuis Object.ToString (); retourne un objet String. La classe String dérive de l'objet, mais quoi? Si les deux sont dans le même ensemble, il n'y a pas de problème.

En plus de ce que les autres ont dit que vous pouvez aussi dériver une classe d'une classe de base qui utilise la classe dérivateur comme paramètre de type générique. Il y a beaucoup d'utilisations soignées pour ce motif.

public class A<T>
{
}

public class B : A<B>
{
}

Si vous voulez voir une dépendance circulaire dans le cadre .NET, alors ne cherchez pas plus loin que System.dll, System.Xml.dll et System.Configuration.dll:

Comment Microsoft a créé ces assemblées est un mystère pour moi. En fait, je pourrais poster cela comme autre question . ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top