2016-11-09 1 views
-2

Я понимаю, как функции полиморфизма в классах и переопределять. Что я не понимаю, как использовать его для объектов.Как полиморфизм в C# (normaly и with Abstract)

abstract class Film 
{ 
    protected string film_name; 

    public Film(string film_name) 
    { 
     this.film_name = film_name; 
    } 

    public string GetFilmName() 
    { 
     return this.film_name; 
    } 



} 

class Siries : Film 
{ 
    private int season_number; 

    public Siries 
    { 
     // What do i need to write here? and why?.. 
    } 


} 
+0

Вам необходимо прочитать несколько руководств по полиморфизму C#: https://msdn.microsoft.com/en-us/library/ms173152.aspx и https://msdn.microsoft.com/en-us/library /k6sa6h87.aspx –

+0

Полиморфизм - это больше о переопределении методов и свойств, чем конструкторов ... Что вы подразумеваете под «как использовать его для объектов?» Классы - это шаблоны объектов, поэтому, если вы понимаете, что для классов нет ничего более понимать в «объектах». – Divisadero

+3

Downvoting, потому что можно было взять книгу, google it, провести некоторое исследование, прежде чем позволить другим решить свои проблемы. –

ответ

0

Если Сириес - это особый фильм.

Ключевое слово «base» вызывает конструктор базового слоя «Film».

public Siries() : base("siries") 
{ 
} 

Если вы хотите сделать серию с именем и номером, вы должны сделать это так.

public Siries(string siries_name, int season_number) : base(siries_name) 
{ 
    this.season_number = season_number; 
} 
0

Возможно, это может быть ответ того, что вы ожидаете.

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

По вашему примеру,

Film f = new Siries(); 
f.method()// Method what you expect to call by object 
0

Я предлагаю перепроектирования с свойствами вместо Get функций; Что касается вашего вопроса в производном классе конструктор, вы должны реализовать

  • вызов соответствующий базовый конструктор класса
  • добавить производный класс логики

что-то вроде этого:

abstract class Film { 
    // let field be private, but property be protected 
    private string m_FilmName; 

    public Film(string filmName) { 
     FilmName = filmName; 
    } 

    // FilmNam is more natural/readable in your case than GetFilmName() method 
    public string FilmName { 
     get { 
     return m_FilmName; 
     } 
     protected set { // "private set" seems to be a better choice 
     // do not forget to validate the input value in public/protected methods 
     if (string.IsNullOrWhiteSpace(value)) 
      throw new ArgumentNullException("value", 
      "FileName must not be null or white space"); 

     m_FilmName = value; 
     } 
    } 
    } 

...

class Siries: Film { 
    private int m_SeasonNumber; 

    // Answer: 
    // 1. You have to call base class constructor ": base(filmName)" 
    // 2. Add up some logic with "seasonNumber" - "SeasonNumber = seasonNumber;" 
    public Siries(String filmName, int seasonNumber = 1) 
     : base(filmName) { 

     SeasonNumber = seasonNumber; 
    } 

    public int SeasonNumber { 
     get { 
     return m_SeasonNumber; 
     } 
     protected set { // may be "private set" or just "set" (public) 
     // do not forget to validate the input value in public/protected methods 
     if (value <= 0) 
      throw new ArgumentOutOfRange("value", "SeasonNumber must be positive"); 

     m_SeasonNumber = value; 
     } 
    } 
    } 
Смежные вопросы