public boolean isDefined()
	{
		if(!isPlain()){
			// Über Kindelemente iterieren
			for(final Data data : this) {
				if(!data.isDefined()) {
					return false;
				}
			}
			return true;
		}

		final AttributeType attributeType = getAttributeType();
		// Alle Attribute, die einen "undefiniert Wert" zu Verfügung stellen, implementieren
		// das Interface "UndefinedAttributeValueAccess"
		if(attributeType instanceof UndefinedAttributeValueAccess) {
			final UndefinedAttributeValueAccess undefinedAttributeValueAccess = (UndefinedAttributeValueAccess)attributeType;
			// Alle Typen, bis auf den <code>StringAttributeType</code> können entscheiden ob
			// die jeweiligen Attribute definiert sind (wenn der Wert des Attributes gleich dem "undefiniert Wert" ist, dann
			// ist das Attribut nicht definiert).

			// Am Attribut kann als Default-Wert der Wert "_Undefiniert" gesetzt werden. Dies entspricht aber dem
			// undefiniert Wert und könnte somit nicht erkannt werden, wenn nur der Attributwert mit dem undefiniert Wert
			// verglichen werden würde.
			// Darum wird an dieser Stelle geprüft, ob am Attribut ein Default-Wert gesetzt wird. Falls dies der Fall ist,
			// ist das Attribut definiert (es ist ja nicht möglich einen Undefiniert Wert anzugeben).
			if(attributeType instanceof StringAttributeType) {
				// Prüfen ob Default-Data am Attribut oder am Attributtyp vorhanden ist.
				if(_info instanceof AbstractAttributeInfo && ((AbstractAttributeInfo)_info).getDefaultAttributeValue() != null) {
					// wenn Defaultwert vorhanden, dann ist der Wert auf jeden Fall definiert, weil es keinen undefinierten Zustand gibt.
					return true;
				}
				else if(attributeType.getDefaultAttributeValue() != null) {
					// wenn Defaultwert vorhanden, dann ist der Wert auf jeden Fall definiert, weil es keinen undefinierten Zustand gibt.
					return true;
				}
			}
			return undefinedAttributeValueAccess.isDefined(this);
		}
		else {
			// Für diesen AttributeType wurde kein "undefiniert Wert" festgelegt (Beispielsweise DoubleAttributeType).
			// Da es keinen undefiniert Wert gibt, sind automatisch alle Werte gültig.
			return true;
		}
	}