【问题标题】:C# Calling constructor of extended classC#调用扩展类的构造函数
【发布时间】:2014-04-18 06:00:52
【问题描述】:

比如说我有以下课程:

    class SuperModel
{
    private OracleProvider database;
    private SqlTemplates template;
    public SuperModel()
    {
        this.database = new OracleProvider();
        this.template = new SqlTemplates(database);
    }

    protected SqlTemplates getTemplate()
    {
        return this.template;
    }
}

现在我有以下类扩展上述内容:

    class Henvendelser : SuperModel
{
    public Henvendelser()
    {

    }

    public ArrayList getQueue(DateTime start, DateTime end)
    {
        String sql =
                "SELECT                                                                     " +
                "   TIDSPUNKT,                                                              " +
                "   NVL(QUEUE,' ') AS QUEUE,                                                " +
                "   NVL(SUM(ANTAL_KALD),0) AS CALLS,                                        " +
                "   NVL(SUM(ANTAL_BESVARET),0) AS ANSWERED_CALLS,                           " +
                "   NVL(SUM(BESVARET_25_SEK),0) AS ANSWERED_CALLS_25_SEC,                   " +
                "   NVL(SUM(INTERN_KALD),0) AS INTERNAL_CALLS                               " +
                "FROM                                                                       " +
                "   KS_DRIFT.PERO_NKM_KØ_OVERSIGT                                           " +
                "WHERE                                                                      " +
                "   TIDSPUNKT >= '" + start+ "' AND                                         " +
                "   TIDSPUNKT <= '" + end + "' AND                                          " +
                "   TO_CHAR(TIDSPUNKT,'DY') NOT IN ('AB')                                   " +
                "GROUP BY                                                                   " +
                "   QUEUE                                                                   " +
                "ORDER BY                                                                   " +
                "   TIDSPUNKT                                                               ";

        ArrayList result = this.getTemplate().template(sql, SqlTemplates.READ_FROM_QUERY);
        return result;
   }
}

SuperModel 的构造函数是自动调用的还是我必须做一些事情来确保它被调用?

【问题讨论】:

  • 您可能会发现使用连词更舒服
  • 动词字符串?对不起,我对 C# 很陌生,只处理过 java
  • 通过在字符串前面加上 @ 前缀,您可以在其中添加换行符,而无需转义 '\'(这对路径很有用)。 tutorials.csharp-online.net/…

标签: c# oop inheritance


【解决方案1】:

在您的特定代码中,它被隐式调用。要显式调用它,您需要使用 base 关键字。

见:Using Constructors C#

在派生类中,如果未调用基类构造函数 通过使用 base 关键字显式地使用默认构造函数,如果 有一个,被隐式调用。

所以你在派生类中的构造函数:

public Henvendelser()

等于

public Henvendelser() :base()

您的代码中的其他小观察:

  1. 使用List&lt;T&gt; 而不是ArrayList
  2. 在查询中使用参数而不是字符串连接。见Sql Injection

【讨论】:

  • 什么时候需要显式使用?
  • @MarcRasmussen,一种特殊情况可能是基类中没有默认(无参数)构造函数,
  • 我正在使用 ArrayList,因为我试图使其尽可能通用,而使用 ArrayList 我不必指定列表中的内容?
  • @MarcRasmussen,你应该看到:stackoverflow.com/questions/2309694/…
  • @MarcRasmussen - 如果你应该使用 List,ArrayList 会更糟。如果您想“推迟”知道类型,请使用 var
猜你喜欢
  • 2014-05-29
  • 2018-09-26
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2013-05-29
  • 2019-01-07
  • 2017-03-08
相关资源
最近更新 更多