Feedback

Der * Operator mal anders…

Sprache: C#

Dieses Beispiel implementiert den *-Operator auf ein klonbares Objekt. Ein Code nach dem Muster [code] MyCloneableObject myObj = new MyCloneableObject(); IEnumerable<MyCloneableObject> list = myObj * 5979; [/code] würde eine Liste mit 5979 geklonten Instanzen von [b]myObj[/b] zurückgeben, die man bspw. mit der LINQ-Extension ToArray() in ein Array umwandeln kann. Eine umgekehrte Verwendung wie [code] MyCloneableObject myObj = new MyCloneableObject(); IEnumerable<MyCloneableObject> list = 5979 * myObj; [/code] ist ebenfalls möglich.
using System;
using System.Collections.Generic;

namespace MarcelJKloubert
{
    public class MyCloneableObject : ICloneable
    {
        #region Methoden
        /// <summary>
        /// 
        /// </summary>
        /// <see cref="System.ICloneable.Clone()"/>
        public object Clone()
        {
            // hier kommt der Code zum klonen des Objektes rein...
        }
        #endregion

        #region Operatoren
        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(MyCloneableObject obj, int count)
        {
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count");
            }

            for (int i = 0; i < count; i++)
            {
                MyCloneableObject item = obj is MyCloneableObject ?
                                         (MyCloneableObject)obj.Clone() : null;

                yield return item;
            }
        }

        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(int count, MyCloneableObject obj)
        {
            return obj * count;
        }
        #endregion
    }
}
using System;
using System.Collections.Generic;

namespace MarcelJKloubert
{
    public class MyCloneableObject : ICloneable
    {
        #region Methoden
        /// <summary>
        /// 
        /// </summary>
        /// <see cref="System.ICloneable.Clone()"/>
        public object Clone()
        {
            // hier kommt der Code zum klonen des Objektes rein...
        }
        #endregion

        #region Operatoren
        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(MyCloneableObject obj, int count)
        {
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count");
            }

            for (int i = 0; i < count; i++)
            {
                MyCloneableObject item = obj is MyCloneableObject ?
                                         (MyCloneableObject)obj.Clone() : null;

                yield return item;
            }
        }

        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(int count, MyCloneableObject obj)
        {
            return obj * count;
        }
        #endregion
    }
}

2 Kommentare

  1. Hmm ganz ehrlich gefällt mir das nicht. Ist irgendwie nicht intuitiv für diesen Operator. Da würde ich eher eine Methode machen wo ich die Anzahl der Klone angebe und diese dann eine IEnumerabel zurück gibt.