C#抽象类澄清

时间:2009-11-20 05:54:06

标签: c#

由于抽象类无法初始化,为什么允许构造函数?

我想,Incase我需要将信息传递给基类(这个类中的抽象类),我需要有构造函数。我......意思是

     abstract class Person    
     {
        string regNo,name;

        public Person(string regNo,string name)
        {
            this.regNo = regNo;
            this.name = name;
        }

        public string RegNo
        {
            get { return regNo; }
        }

        public string Name
        {
            get { return name; }
        }

    }

    class student : Person
    {
        student(string regno, string name)
            : base(regno, name)
        {
        }
    }

这是抽象类中允许构造函数的目的吗?

4 个答案:

答案 0 :(得分:18)

虽然它无法在其自己的上实例化,但是抽象类可以具有将由其派生类的构造函数调用的构造函数。

这对于基础本身中包含的成员的初始化特别有用。 (即当派生类的构造函数包含对“base()”的引用时)。

事实上,正如Jason Down提醒我们的那样,如果未明确定义这样的构造函数,则类总是提供无参数的默认构造函数。

答案 1 :(得分:2)

Udanamehar,    我使用抽象的主要原因是我已经将该实体确定为我将重复使用的东西。所以,我可能会编写一些代码:

public class Student : Person
{
    public int StudentID { get; protected set; }

    public Student(int studentID, string regNo,string name) : base(regNo,Name)
    {
        this.StudentID = studentID;
    }

}

我会用“......所有学生都是人”这样的语言表达,因此我们有一种“是一种”关系,这种关系是明确表达的。我实际上没有编译和测试上面的例子。 。但是你明白了。

希望这会有所帮助。 。 。

答案 2 :(得分:1)

从简单的意义上讲, 程序员懒惰,懒惰是创造力和效率的美德, 我希望所有基类/超类的派生类共有的构造函数活动通常放在base / super类中。

在下图中,所有员工都获得了医疗保健和薪水,但并非所有员工都具有相同的专业知识。

abstract class Employee{
  public Employee(){
    setHealthCare();
    setSalary();}

  ....}

class Programmer:Employee{
  public Programmer(){
    setLanguages();}
  ....}

class BeanCounter:Employee{
  public BeanCounter(){
    setBeans();}
  ....}

答案 3 :(得分:1)

您可以在抽象类中使用构造函数来实现特定于它的逻辑。例如,您将在该构造函数中初始化私有字段,尤其是如果它们不是默认值,因为派生类不能再看到私有字段。

在抽象类中具有一个或多个参数的构造函数也可能以某种重要的方式初始化抽象类的行为。大多数情况下,您会发现建议在派生类中包装这些构造函数重载。

C#(或可能是整个.NET CLI)确实有点令人恼火甚至是设计缺陷,你可以在抽象类中定义 public 构造函数,因为它总是有效的在那种情况下,受保护。我一个人总是声明我的抽象类构造函数受保护(当然,如果必要的话,则不太明显)。