Page d'Accueil

Combinaisons de classes

 

Emboîtement de classe

Une classe peut être créée à l'intérieur d'une autre classe. Une classe créée à l'intérieur des autres est dite emboîtée. Pour emboîter une classe, la créer simplement comme vous faites pour tout autre. Voici un exemple d'une classe appelée Inside qui est emboîtée dans une classe appelée Outside :

public class Outside
{
    public class Inside
    {
    }
}

De la même manière, vous pouvez emboîter autant de classes que vous souhaitez dans une classe et vous pouvez emboîter autant de classes à l'intérieur d'autre les classes emboîtées si vous le jugez nécessaire. Juste comme vous contrôleriez n'importe quelle autre classe ainsi pouvez vous exercer un contrôle sur une classe emboîté. Par exemple, vous pouvez déclarer tous les champs nécessaires, propriétés, ou méthodes dans une classe emboîtée ou dans une classe à emboîter. Quand vous créez une classe à l'intérieur d'un  autre, il n'y a aucune relation programmatique spécial entre les deux classes :  juste parce qu'une classe est emboîtée ne signifie pas que la classe emboîtée a un accès immédiat aux membres de la classe qui emboîte. Elless sont deux classes différentes et elles peuvent être utilisées séparément selon que c'est nécessaire nécessaire. 

Le nom d'une classe emboîtée n'est pas « visible » en dehors de de la classe qui emboîte. Pour accéder à une classe emboîtée en dehors de de la classe aui emboîte, vous devez qualifier le nom de la classe emboîtée n'importe où vous voulez l'utiliser. Par exemple, si vous voulez déclarer une variable de Inside quelque part dans le programme mais en dehors de Outside, vous devez qualifier son nom. Voici un exemple :

using System;

public class Outside
{
    public class Inside
    {
	public Inside()
	{
	    Console.WriteLine(" -= Inside =-");
	}
    }

    public Outside()
    {
	Console.WriteLine(" =- Outside -=");
    }
}

class Exercise
{
    static void Main()
    {
	Outside Recto = new Outside();
	Outside.Inside Ins = new Outside.Inside();
    }
}

Ceci produirait :

=- Outside -=
 -= Inside =-

Puisqu'il n'y a aucun rapport programmatically privilégié entre une classe emboîtée et sa classe « receveuse », si vous voulez accéder à la classe emboîtée dans la classe qui emboîte, vous pouvez utiliser ses membres statiques. En d'autres termes, si vous voulez, vous pouvez déclarer  statique tous les membres de la classe emboîtée à la laquelle vous voulez accéder dans la classe qui emboîte. Voici un exemple :

using System;

public class Outside
{
    public class Inside
    {
	public static string InMessage;

	public Inside()
	{
	    Console.WriteLine(" -= Insider =-");
	    InMessage = "Sitting inside while it's raining";
	}

	public static void Show()
	{
	Console.WriteLine("Show me the wonderful world of C# Programming");
	}
    }

    public Outside()
    {
	Console.WriteLine(" =- The Parent -=");
    }

    public void Display()
    {
	Console.WriteLine(Inside.InMessage);
	Inside.Show();
    }
}

class Exercise
{
    static void Main()
    {
	Outside Recto = new Outside();
	Outside.Inside Ins = new Outside.Inside();

	Recto.Display();
    }
}

De la même manière, si vous voulez accéder à la classe qui emboîte dans la classe emboîtée, vous pouvez passer par les membres statiques de la classe qui emboîte. Pour ce faire, vous pouvez déclarer statique tous les membres de la classe qui emboîte auxquels vous voulez accéder dans la classe emboîtée. Voici un exemple :

using System;

public class Outside
{
	public class Inside
	{
		public static string InMessage;

		public Inside()
		{
			Console.WriteLine(" -= Insider =-");
			InMessage = "Sitting inside while it's raining";
		}

		public static void Show()
		{
	Console.WriteLine("Show me the wonderful world of C# Programming");
		}

		public void FieldFromOutside()
		{
			Console.WriteLine(Outside.OutMessage);
		}
	}

	private static string OutMessage;

	public Outside()
	{
		Console.WriteLine(" =- The Parent -=");
		OutMessage = "Standing outside! It's cold and raining!!";
	}

	public void Display()
	{
		Console.WriteLine(Inside.InMessage);
		Inside.Show();
	}
}

class Exercise
{
	static void Main()
	{
		Outside Recto = new Outside();
		Outside.Inside Ins = new Outside.Inside();

		Recto.Display();
		Console.WriteLine();
		Ins.FieldFromOutside();
	}
}

Ceci produirait :

=- The Parent -=
 -= Insider =-
Sitting inside while it's raining
Show me the wonderful world of C# Programming

Standing outside! It's cold and raining!!

Au lieu des membres statiques, si vous voulez accéder à des membres d'une classe emboîtée dans la classe qui emboîte, vous pouvez d'abord déclarer une variable de la classe emboîtée dans la classe qui emboîte. De la même manière, si vous voulez accéder à des membres d'une classe qui emboîte dans la classe emboîtée, vous pouvez d'abord déclarer une variable de la classe qui emboîte dans la classe emboîtée. Voici un exemple :

using System;

public class Outside
{
	// A member of the nesting class
	private string OutMessage;

	// The nested class
	public class Inside
	{
		// A field in the nested class
		public string InMessage;

		// A constructor of the nested class
		public Inside()
		{
			Console.WriteLine(" -= Insider =-");
			this.InMessage = "Sitting inside while it's raining";
		}

		// A method of the nested class
		public void Show()
		{
			// Declare a variable to access the nesting class
			Outside outsider = new Outside();
			Console.WriteLine(outsider.OutMessage);
		}
	} // End of the nested class

	// A constructor of the nesting class
	public Outside()
	{
		this.OutMessage = "Standing outside! It's cold and raining!!";

		Console.WriteLine(" =- The Parent -=");
	}

	// A method of the nesting class
	public void Display()
	{
		Console.WriteLine(insider.InMessage);
	}

	// Declare a variable to access the nested class
	Inside insider = new Inside();
}

class Exercise
{
	static void Main()
	{
		Outside Recto = new Outside();
		Outside.Inside Ins = new Outside.Inside();

		Ins.Show();
		Recto.Display();
	}
}

Ceci produirait :

-= Insider =-
 =- The Parent -=
 -= Insider =-
 -= Insider =-
 =- The Parent -=
Standing outside! It's cold and raining!!
Sitting inside while it's raining

Une classe prise comme champ

Exactement comme n'importe laquelle des variables que nous avons utiliées jusqu'ici, vous pouvez faire d'une classe ou d'une structure une variable membre d'une autre classe. Pour utiliser une classe dans votre propre classe, naturellement vous devez avoir cette classe. Vous pouvez utiliser une des classes déjà disponibles dans C# ou vous pouvez d'abord créer votre propre classe. Voici un exemple d'une classe :

class Point
{
    public short x;
    public short y;
}

Un champ est une variable membre créée à partir d'une autre classe à la place d'un type primitif. Pour utiliser une classe comme variable membre d'une autre classe, déclarez simplement sa variable comme vous procéderiez avec n'importe laquelle des variables membres que nous avons déclarées jusqu'ici. Voici un exemple :

public class Point
{
    public short x;
    public short y;
}

public class CoordinateSystem
{
    public Point Start;
}

Après qu'une classe ait été déclarée comme variable membre d'une autre classe, elle peut être utilisée régulièrement. Puisque le membre est une classe, déclarée comme référence, il y a quelques règles que vous devez suivre pour l'utiliser. Après la déclaration de la variable membre, vous devez vous assurer que vous lui avez assigné une mémoire. Vous devez également vous assurer que la variable est initialisée convenablement avant qu'elle puisse être utilisée ; autrement vous recevriez une erreur en compilant le programme.

Étude pratique Étude pratique : Utiliser une classe comme champ

  1. Commencez une nouvelle application de console et l'appeler ElectonicStore1
  2. Pour créer une nouvelle classe, dans Explorateur de solution, droit-cliquez le nom du projet, placez la souris sur Ajouter et cliquez classe…
  3. Placez le nom StoreItem et cliquez Ajouter
  4. Changez le fichier comme suit :
     
    using System;
    
    namespace ElectronicStore1
    {
        public class StoreItem
        {
            private long nbr;
            private char cat;
            private string mk;
            private string mdl;
            private double price;
    
            public long GetItemNumber()
            {
            return nbr;
            }
    
            public void SetItemNumber(long number)
            {
                this.nbr = number;
            }
    
            public char GetCategory()
            {
                return cat;
            }
    
            public void SetCategory(char category)
            {
                this.cat = category;
            }
    
            public string GetMake()
            {
                return mk;
            }
    
            public void SetMake(string make)
            {
                this.mk = make;
            }
    
            public string GetModel()
            {
                return mdl;
            }
    
            public void SetModel(string model)
            {
                this.mdl = model;
            }
    
            public double GetUnitPrice()
            {
                return price;
            }
    
            public void SetUnitPrice(double unitPrice)
            {
                this.price = unitPrice;
            }
        }
    }
  5. Accédez au fichier Program.cs et changez le comme suit :
     
    using System;
    
    namespace ElectronicStore1
    {
        class Program
        {
            static void Main()
            {
                string strTitle1 = "=-= Nearson Electonics =-=\n";
                string strTitle2 = "******* Store Items ******";
    
                Console.WriteLine();
            }
        }
    }
  6. Sauvegardez tout

Renvoi d'une classe à partir d'une méthode

Comme une valeur d'un type régulier, vous pouvez renvoyer une valeur classe d'une méthode de classe. Pour ce faire, vous pouvez d'abord déclarer la méthode et indiquer la classe comme le type de renvoi. Voici un exemple :

public class Point
{
    public short x;
    public short y;
}

public class CoordinateSystem
{
    private Point Start;
    private Point End;

    public Point GetThePoint()
    {
    }
}

Après avoir appliqué la méthode, vous devez renvoyer une valeur qui est conforme à la classe, autrement vous recevriez une erreur en compilant l'application. Vous pouvez procéder en déclarant une variable de classe dans le corps de la méthode, initialisant la variable, et puis la renvoyant. Voici un exemple :

public class Point
{
    public short x;
    public short y;
}

public class CoordinateSystem
{
    private Point Start;
    private Point End;

    public Point GetThePoint()
    {
        Point pt = new Point();

        Console.Write("Enter the x coordinate of the point: ");
        pt.x = short.Parse(Console.ReadLine());
        Console.Write("Enter the y coordinate of the point: ");
        pt.y = short.Parse(Console.ReadLine());
        return pt;
    }
}

Une fois qu'une méthode a renvoyé une valeur d'une classe, la valeur peut être utilisée aussi normalement que possible.

Passer une classe comme argument

Une fois qu'une classe a été créée, elle peut être utilisée comme n'importe quelle autre variable. Par exemple, sa variable peut être passée comme argument à une méthode d'une autre classe. Quand une classe est passée comme argument, ses membres publics sont disponibles à la méthode qui les utilise. Comme fait pour les arguments des types primitifs, vous pouvez passer plus d'une classe comme argument à une méthode. Voici les différents exemples :

using System;

namespace Geometry
{
    public class Point
    {
        public short x;
        public short y;
    }

    public class CoordinateSystem
    {
        public Point Start;
        public Point End;

        public Point GetThePoint()
        {
            Point pt = new Point();

            Console.Write("Enter the x coordinate of the point: ");
            pt.x = short.Parse(Console.ReadLine());
            Console.Write("Enter the y coordinate of the point: ");
            pt.y = short.Parse(Console.ReadLine());
            return pt;
        }

        public double DistanceFromOrigin(Point pt)
        {
            double sqr1 = Math.Pow(pt.x, 2);
            double sqr2 = Math.Pow(pt.y, 2);
            double distance = Math.Sqrt(sqr1 + sqr2);
            return distance;
        }

        public double DistanceBetween2Points(Point pt1, Point pt2)
        {
            double sqr1 = Math.Pow(pt2.x - pt1.x, 2);
            double sqr2 = Math.Pow(pt2.y - pt1.y, 2);
            double distance = Math.Sqrt(sqr1 + sqr2);
            return distance;
        }
    }

    class Program
    {
        private static CoordinateSystem IdentifyCoordinates()
        {
            CoordinateSystem coord = new CoordinateSystem();

            Console.WriteLine("Start Point");
            coord.Start = coord.GetThePoint();
            Console.WriteLine("End Point");
            coord.End = coord.GetThePoint();

            return coord;
        }

        private static void Show(CoordinateSystem c)
        {
            Console.WriteLine("Coordinate System");
            Console.WriteLine("Starting Point: P({0}, {1})", c.Start.x, c.Start.y);
            Console.WriteLine("Ending Point:   Q({0}, {1})", c.End.x, c.End.y);
            Console.WriteLine("Distance Between Both Points: {0:F}",
                              c.DistanceBetween2Points(c.Start, c.End));
        }

        static void Main(string[] args)
        {
            CoordinateSystem coord = IdentifyCoordinates();

            Console.WriteLine();
            Show(coord);
        }
    }
}

Voici un exemple d'exécution du programme :

Start Point
Enter the x coordinate of the point: -2
Enter the y coordinate of the point: 2
End Point
Enter the x coordinate of the point: 3
Enter the y coordinate of the point: -6

Coordinate System
Starting Point: P(-2, 2)
Ending Point:   Q(3, -6)
Distance Between Both Points: 9.43
Press any key to continue . . .

Puisque les classes sont toujours utilisées comme références, en passant une classe comme argument, elle est impliquée pour être passées par référence. Pour renforcer ceci, vous pouvez dactylographier le mot-clé ref à la gauche de l'argument. Voici un exemple:

using System;

namespace ConsoleApplication1
{
    public class Point
    {
        public short x;
        public short y;
    }

    public class CoordinateSystem
    {
        public Point Start;
        public Point End;

        public Point GetThePoint()
        {
            Point pt = new Point();

            Console.Write("Enter the x coordinate of the point: ");
            pt.x = short.Parse(Console.ReadLine());
            Console.Write("Enter the y coordinate of the point: ");
            pt.y = short.Parse(Console.ReadLine());
            return pt;
        }

        public double DistanceFromOrigin(ref Point pt)
        {
            double sqr1 = Math.Pow(pt.x, 2);
            double sqr2 = Math.Pow(pt.y, 2);
            double distance = Math.Sqrt(sqr1 + sqr2);
            return distance;
        }

        public double DistanceBetween2Points(ref Point pt1, ref Point pt2)
        {
            double sqr1 = Math.Pow(pt2.x - pt1.x, 2);
            double sqr2 = Math.Pow(pt2.y - pt1.y, 2);
            double distance = Math.Sqrt(sqr1 + sqr2);
            return distance;
        }
    }

    class Program
    {
        private static CoordinateSystem IdentifyCoordinates()
        {
            CoordinateSystem coord = new CoordinateSystem();

            Console.WriteLine("Start Point");
            coord.Start = coord.GetThePoint();
            Console.WriteLine("End Point");
            coord.End = coord.GetThePoint();

            return coord;
        }

        private static void Show(CoordinateSystem c)
        {
            Console.WriteLine("Coordinate System");
            Console.WriteLine("Starting Point: P({0}, {1})", c.Start.x, c.Start.y);
            Console.WriteLine("Ending Point:   Q({0}, {1})", c.End.x, c.End.y);
            Console.WriteLine("Distance Between Both Points: {0:F}",
                              c.DistanceBetween2Points(ref c.Start, ref c.End));
        }

        static void Main(string[] args)
        {
            CoordinateSystem coord = IdentifyCoordinates();

            Console.WriteLine();
            Show(coord);
        }
    }
}
 

Étude pratique Étude pratique : Renvoyer une classe ou passer une comme argument

  1. Pour renvoyer une classe ou la passer comme argument, changez le fichier Program.cs comme suit:
     
    using System;
    
    namespace ElectronicStore1
    {
        public class SaleItem
        {
            double DiscountAmount;
            double NetPrice;
            int    Quantity;
            double SaleTotal;
    
            public double GetDiscountRate()
            {
        Console.Write("Discount Applied (Enter 0 to 100, 0 if no discount): ");
                double discount = double.Parse(Console.ReadLine());
                return discount;
            }
    
            public int GetQuantity()
            {
                Console.Write("Enter Quantity: ");
                int q = int.Parse(Console.ReadLine());
                return q;
            }
    
            public StoreItem Create()
            {
                long itemNumber;
                char category;
                string make;
                string model;
                double discount;
                double price;
                StoreItem saleItem = new StoreItem();
    
                Console.Write("Enter the Item #: ");
                itemNumber = long.Parse(Console.ReadLine());
                Console.WriteLine("Category");
                Console.WriteLine("A - Audio Cables");
                Console.WriteLine("B - Instructional and Tutorials (Books)");
                Console.WriteLine("C - Cell Phones and Accessories");
                Console.WriteLine("D - Bags and Cases");
                Console.WriteLine("E - Headphones");
                Console.WriteLine("F - Instructional and Tutorials (VHS & DVD)");
                Console.WriteLine("G - Digital Cameras");
                Console.WriteLine("H - Cables and Connectors");
                Console.WriteLine("I - PDAs and Accessories");
                Console.WriteLine("J - Telephones and Accessories");
                Console.WriteLine("K - Surge Protector");
                Console.WriteLine("L - TVs and Videos");
                Console.WriteLine("U - Unknown");
                Console.Write("Your Choice? ");
                category = char.Parse(Console.ReadLine());
                Console.Write("Make:        ");
                make = Console.ReadLine();
                Console.Write("Model:       ");
                model = Console.ReadLine();
                Console.Write("Unit Price:  ");
                price = double.Parse(Console.ReadLine());
                
                saleItem.SetItemNumber(itemNumber);
                saleItem.SetCategory(category);
                saleItem.SetMake(make);
                saleItem.SetModel(model);
                saleItem.SetUnitPrice(price);
    
                return saleItem;
            }
            
            public void ShowSaleItem(StoreItem item)
            {
                double discountRate = GetDiscountRate();
                int    quantity     = GetQuantity();
                DiscountAmount = item.GetUnitPrice() * discountRate / 100;
                NetPrice = item.GetUnitPrice() - DiscountAmount;
                SaleTotal = NetPrice * quantity;
    
                Console.WriteLine("\nStore Item Description");
                Console.WriteLine("Item Number:     {0}", item.GetItemNumber());
                Console.WriteLine("Category:        {0}", item.GetCategory());
                Console.WriteLine("Make             {0}", item.GetMake());
                Console.WriteLine("Model:           {0}", item.GetModel());
                Console.WriteLine("Unit Price:      {0:C}", item.GetUnitPrice());
                Console.WriteLine("Discount Rate:   {0:P}", discountRate/100);
                Console.WriteLine("Discount Amount: {0:C}", DiscountAmount);
                Console.WriteLine("Price/Item:      {0:C}", NetPrice);
                Console.WriteLine("Quantity:        {0}", quantity);
                Console.WriteLine("Sale Total:      {0:C}", SaleTotal);
            }
        }
    
        class Program
        {
            static void Main()
            {
                StoreItem item = new StoreItem();
                SaleItem sale = new SaleItem();
                string strTitle1 = "=-= Nearson Electonics =-=\n";
                string strTitle2 = "******* Store Items ******";
    
                Console.WriteLine(strTitle1);
                Console.WriteLine(strTitle2);
    
                item = sale.Create();
                sale.ShowSaleItem(item);
    
                Console.WriteLine();
            }
        }
    }
  2. Exécutez l'application. Voici un exemple :
     
    =-= Nearson Electonics =-=
    
    ******* Store Items ******
    Enter the Item #: 927374
    Category
    A - Audio Cables
    B - Instructional and Tutorials (Books)
    C - Cell Phones and Accessories
    D - Bags and Cases
    E - Headphones
    F - Instructional and Tutorials (VHS & DVD)
    G - Digital Cameras
    H - Cables and Connectors
    I - PDAs and Accessories
    J - Telephones and Accessories
    K - Surge Protector
    L - TVs and Videos
    U - Unknown
    Your Choice? L
    Make:        NEC
    Model:       VT48 Video Projector
    Unit Price:  705.95
    Discount Applied (Enter 0 to 100, 0 if no discount): 15
    Enter Quantity: 1
    
    Store Item Description
    Item Number:     927374
    Category:        L
    Make             NEC
    Model:           VT48 Video Projector
    Unit Price:      $705.95
    Discount Rate:   15.00 %
    Discount Amount: $105.89
    Price/Item:      $600.06
    Quantity:        1
    Sale Total:      $600.06
    
    Press any key to continue . . .
    Projector
  3. Fermez la fenetre DOS
 

Page d'Accueil Copyright © 2007-2008, Yevol