【问题标题】:implement one abstract method in two child classes在两个子类中实现一个抽象方法
【发布时间】:2016-05-17 17:06:47
【问题描述】:

我有两个子类和一个父类。

父类有抽象方法,它有一个类作为参数。子类实现父类的抽象方法,它有另一个类作为参数。但是子类方法报错:

“不实现继承的抽象成员”。

代码如下:

abstract class StudentBizz
{
    public abstract Boolean enrollNewStudent(Student stuObj);
}

class MScStudentBizz:StudentBizz
{
    public override Boolean enrollNewStudent(MScStudent stuObj)
    {
        //code
    }
}

【问题讨论】:

  • 当有人StudentBizz foo = new MScStudentBizz(); foo.enrollNewStudent(new OtherStudent()) 时你想发生什么? (OtherStudent 是一个继承自 Student 但不继承自 MScStudent 的类)

标签: c# abstract


【解决方案1】:

根据您的其余代码,另一种方法可能是使用generics with type constraints(这里我假设MScStudent 继承自Student):

abstract class StudentBizz<TStudent> where TStudent : Student
{
    public abstract Boolean enrollNewStudent(TStudent stuObj);
}

class MScStudentBizz:StudentBizz<MScStudent>
{
    public override Boolean enrollNewStudent(MScStudent stuObj)
    {
        //code
    }
}

【讨论】:

  • 这是我所期望的。它真的很好用。谢谢
【解决方案2】:

覆盖方法应与基类方法具有相同的签名。 因此,您的覆盖方法应如下所示:

class MScStudentBizz: StudentBizz 
{ 
  public override Boolean enrollNewStudent(Student student) 
  { 
     //code
  } 
}

【讨论】:

  • 如果没有解决办法??唯一的解决方案是使用相同的方法签名?
  • @Nuwan:如果你想改变student参数的类型,你需要在StudentBizz中使用泛型类型参数。
  • 是的。声明一个抽象成员意味着您需要具有完全相同的签名才能覆盖。有两种方法可以解决它:最好的方法是,正如其他人所建议的那样,使基础通用学生类型。另一种方法是使用 Student 方法的接口,在派生类中使用显式实现来调用更具体的重载;这样,使用接口的代码使用基本学生(甚至是 IStudent),而专门使用派生类的代码使用相应的专业学生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2016-11-15
  • 2011-12-01
相关资源
最近更新 更多