如何在c#中实现多态性(普通和抽象)

本文关键字:抽象 多态性 实现 | 更新日期: 2023-09-27 18:17:01

我了解如何在类中多态函数和重写。我不明白的是如何使用它的对象。

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?..
    }

}

如何在c#中实现多态性(普通和抽象)

如果系列是一个特定的电影

关键字"base"调用基类"Film"的构造函数。

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

如果你想制作带有名称和数字的系列,你必须这样做。

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

也许这就是你所期待的答案。

创建一个指向派生类的基类对象。这是一个继承的概念。

根据你的例子,

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

我建议属性代替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;
      }
    }
  }