Float currPay, string ssn, int numbOfSales)



Base(FullName, empID, currPay, ssn)

     {

           this.numberOfSales = numbOfSales;

     }

 

     public int NumbSales

     {

     get {return numberOfSales;}

           set

           {

                if (numberOfSales != value)

                     numberOfSales = value;

           }

     }

    

     public override void GiveBonus(float amount)

     {

           int salesBonus = 0;

 

           if(numberOfSales >= 0 && numberOfSales <= 100)

                salesBonus = 10;

           else if(numberOfSales >= 101 && numberOfSales <= 200)

                salesBonus = 15;

           else

                salesBonus = 20; // Anything greater than 200.

 

           base.GiveBonus(amount * salesBonus);

     }

    

     public override void DisplayStats()

     {

           base.DisplayStats();

           Console.WriteLine("Number of sales: " + numberOfSales);

     }

}

}

 

//Файл PTSales.cs

using System;

 

namespace Example1

{

 

Public sealed class PTSalesPerson : SalesPerson

{

    public PTSalesPerson(string FullName, int empID,

Float currPay, string ssn, int numbOfSales)

Base(FullName, empID, currPay, ssn, numbOfSales)

    {

    }

}   

}

 

//Файл EmpApp.cs

using System;

 

namespace Example1

{   

class EmpApp

{

    public EmpApp()

    {}

    public static void FireThisPerson(Employee e)

    {

         Console.WriteLine(e.GetFullName() + " уволен!");

    }

    [STAThread]

    static void Main(string[] args)

    {

             

Console.WriteLine("Эти люди работают на компанию " + Employee.Company);

         Console.WriteLine();            

        

    Manager chucky = new Manager("Татьяна", 92, 100000, "333-23-2322", 9000);

         chucky.GiveBonus(300);

         chucky.DisplayStats();

    

         Console.WriteLine();

   

SalesPerson fran = new SalesPerson("Константин", 93, 30000, "932-32-3232", 31);

         fran.GiveBonus(201);

         fran.DisplayStats();       

                       

         // A Manager 'is-a' object.

object o = new Manager("Сергей", 9, 40000, "111-11-1111", 5);

    ((Manager)o).DisplayStats();

       ((Employee)o). DisplayStats();

    // A Manager 'is-a' Employee

Employee e = new Manager("людмила", 2, 20000, "101-11-1321", 1);

       ((Manager)e).DisplayStats();

       e.DisplayStats();

    

SalesPerson sp = new PTSalesPerson("Алексей", 834, 100000, "111-12-1119", 90);

       ((PTSalesPerson)sp).DisplayStats();

sp.DisplayStats();

             

    FireThisPerson(e);

    FireThisPerson(sp);

             

    FireThisPerson((Employee)o);    

}

}

}

 

Ссылочной переменной базового класса можно присвоить ссылку на объект любого класса, выведенного из этого базового класса.

 

Тип ссылочной переменной (а не тип объекта, на который она ссылается) определяет, какие члены могут быть доступны. Другими словами, когда ссылка на производный класс присваивается ссылочной переменной базового класса, вы получаете доступ только к тем частям объекта, которые определены базовым классом.

 

В С# определен специальный класс с именем object, который является неявным базовым классом всех других классов и типов (включая типы значений). Другими словами, все остальные типы выводятся из класса object. Это означает, что ссылочная переменная типа object может указывать на объект любого типа.

 

Запрет наследования - классы, объявленные как sealed

 

Например,

Public sealed class PTSalesPerson : SalesPerson

{

}

 

Чтобы запретить наследование класса, предварите его объявление ключевым словом sealed.

 

Полиморфизм

Полиморфизм позволяет переопределять реакцию объекта производного класса на метод, определенный в базовом классе.

Для реализации полиморфизма в нашем приложении мы воспользуемся ключевыми словами С# virtual и override.

Если базовый класс определяет метод, который должен быть замещен в производном классе, этот метод должен быть объявлен как виртуальный с помощью ключевого слова virtual. 

При переопределении виртуального метода в производном классе используется модификатор override.

Процесс переопределения виртуального метода в производном классе иногда называется замещением метода (method overriding). При переопределении метода сигнатуры типа у виртуального и метода-заменителя должны совпадать.

 

public class Shape

{

 ….

public virtual void Draw(){….}

 ….

}

public class Circle : Shape

{  

….

public override void Draw()

    {

          //новый код

     }

}

 

public class Hexagon : Shape

{

…..

public override void Draw()

{

  //новый код

}

 

 

}

 

Динамическая диспетчеризация методов — это механизм вызова переопределенного метода во время выполнения программы, а не в период компиляции. Именно благодаря механизму диспетчеризации методов в С# реализуется динамический полиморфизм.

 

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

Если производный класс не переопределяет виртуальный метод в случае многоуровневой иерархии, то будет выполнен первый переопределенный метод, который обнаружится при просмотре иерархической лестницы в направлении снизу вверх.

 

 

Пример .

Файл Shape.cs

using System;

 

namespace VirtualMethod

{   

public class Shape

    

{

    protected string petName;

   

    // Constructors.

    public Shape(){petName = "NoName";}

    public Shape(string s)

    {

         this.petName = s;

    }

             

    public virtual void Draw()

         {

           Console.WriteLine("Рисуем в базовом классе");

         }

        

    public string PetName

    {

         get {return this.petName;}

         set {this.petName = value;}

    }

}

public class Circle : Shape

{

    public Circle(){}

        

    public Circle(string name): base(name){}

 

    public override void Draw()

    {

         Console.WriteLine("Рисуем " + PetName + " круг");

    }

}

 

public class Oval : Circle

{

    public Oval(){base.PetName = "Овал";}

        

    new public void Draw()

    {

         Console.WriteLine("Нарисуем овал");

    }

}

 

public class Hexagon : Shape

{

    public Hexagon(){}

    public Hexagon(string name): base(name){}

 

    public override void Draw()

    {

    Console.WriteLine("Рисуем " + PetName +

          " шестиугольник");

    }

}

}

 

Файл Class1.cs

using System;

 

namespace VirtualMethod

{   

class Class1

{       

    [STAThread]

    static void Main(string[] args)

    {

Shape[] s ={new Hexagon(),

             new Circle(),

             new Hexagon("Шестиуг.2"),

         new Circle("Кружок"),

             new Hexagon("Шестиуг.3"),

             new Oval()};

 

         for(int i = 0; i < s.Length; i++)

         {

              s[i].Draw();

         }

             

         Oval o = new Oval();

         o.Draw();

 

         Hexagon h1= new Hexagon("шестиуг4");

         h1.Draw();

    }

}

}

 

Если убрать квалификаторы virtual  и override:

Абстрактные классы

Пример.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Polymorph2

{

public abstract class Shape

{

   protected string petName;

 

   // Constructors.

   public Shape() { petName = "NoName"; }

   public Shape(string s)

   {

       this.petName = s;

   }

 

   public abstract void Draw();

       

   public string PetName

   {

       get { return this.petName; }

       set { this.petName = value; }

   }

}

public class Circle : Shape

{

   public Circle() { }

 

   public Circle(string name) : base(name) { }

 

   public override void Draw()

   {

       Console.WriteLine("Рисуем " + PetName + " круг");

   }

}

 

public class Oval : Circle

{

   public Oval() { base.PetName = "Овал"; }

 

   new public void Draw()

   {

       Console.WriteLine("Нарисуем овал");

   }

}

public class Hexagon : Shape

{

   public Hexagon() { }

   public Hexagon(string name) : base(name) { }

 

   public override void Draw()

   {

       Console.WriteLine("Рисуем " + PetName +

              " шестиугольник");

   }

}

 

 

class Program

{

   static void Main(string[] args)

   {

       Shape[] s ={new Hexagon(),

                   new Circle(),

                   new Hexagon("Шестиуг.2"),

             new Circle("Кружок"),

                   new Hexagon("Шестиуг.3"),

                   new Oval()};

 

       for (int i = 0; i < s.Length; i++)

       {

           s[i].Draw();

       }

 

       Oval o = new Oval();

       o.Draw();

 

       Hexagon h1 = new Hexagon("шестиуг4");

       h1.Draw();

 

   }

}

}

 

Абстрактные методы

Абстрактный метод создается с помощью модификатора типа abstract. Абстрактный метод не содержит тела и, следовательно, не реализуется базовым классом. Поэтому производный класс должен его переопределить, поскольку он не может использовать версию, предложенную в базовом классе. Абстрактный метод автоматически является виртуальным, поэтому и нет необходимости в использовании модификатора virtual . Более того, совместное использование модификаторов virtual и abstract считается ошибкой. Для объявления абстрактного метода используйте следующий формат записи.

abstract ТИП ИМЯ(список_параметров);

Класс, содержащий один или несколько абстрактных методов, также должен быть объявлен как абстрактный с помощью спецификатора abstract, который ставится перед объявлением class.

Если производный класс выводится из абстрактного, он может реализовать все абстрактные методы базового класса. В противном случае такой производный класс также должен быть определен как абстрактный. Таким образом, атрибут abstract  наследуется до тех пор, пока реализация класса не будет полностью достигнута.

 

 

Пример.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Polymorph3

{

public class Transport

{

   protected string name;

   // Constructors:

   public Transport() { name = "NoName"; }

   public Transport(string s) { this.name = s; }

   public virtual void PlaySignal()

   {

       Console.WriteLine("Нет сигнала!");

   }

   public virtual void Info()

   {

       Console.WriteLine("Transport {0}",name);

       PlaySignal();

   }

}

 

public class Velo : Transport

{

   int wheels; // число колёс

   public Velo(string name,int w): base(name){wheels=w;}

   public override void PlaySignal()

   {

       Console.WriteLine("Дин - Din");

   }

}

 

public class Moto : Transport

{

   int cylinders; // число цилиндров

   public Moto(string name, int cy) : base(name) { cylinders = cy; }

   public override void PlaySignal()

   {

       Console.WriteLine("Бап - Bap");

   }

}

 

public class Auto : Transport

{

   int doors; // число дверей

   public Auto(string name, int d) : base(name) { doors = d; }

   public override void PlaySignal()

   {

       Console.WriteLine("Бии- Bee Bip");

   }

}

 

class Program

{

   static void Main(string[] args)

   {

       Transport [] p = { new Velo("Sputnik",2),

                         new Moto("Ural",2),

                         new Auto("Chevrolet",5),

                         new Auto("Reno",4)};

       for (int i = 0; i < p.Length; i++)

       {

           p[i].Info();

       }

 

   }

}

}

 

 

Если убрать квалификаторы virtual  и override

 

 


Дата добавления: 2020-04-08; просмотров: 87; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!