多个派生抽象类?

Jul*_*syw 7 .net c# abstract-class multiple-inheritance c#-4.0

我必须创建一个课程管理系统,其中包括课程类别:

Cooking, sewing and writing courses
Run Code Online (Sandbox Code Playgroud)

cooking并且writing各有2个疗程(意大利,海鲜,创意写入和商业写).这会创建派生的抽象:

abstract course -> abstract cooking -> concrete seafood
Run Code Online (Sandbox Code Playgroud)

抽象的烹饪和写作有共同的领域和一些常用的方法,但是它们也有抽象的方法在基类中是抽象的.

这可以用C#完成吗?如果我使派生的抽象类方法抽象Visual Studio说他们隐藏了基类抽象,然后具体的类方法有错误说基类必须是抽象的(它必须但不能注册).我找了答案.我知道单继承在C#中使用,但继承带有链.什么是最好的答案?

这是一段代码片段 - 我希望它澄清了这个问题:

public abstract class Course
{
    public abstract void AddStudent(StudentName sn, int f);
    public abstract decimal CalculateIncome();
}

public abstract class WritingCourse : Course
{
    public void AddStudent(StudentName sn, int f)
    {
     //Add student
    }
    public abstract decimal CalculateIncome(); // can only be claculated in concrete
}

public class BusinessWritCourse : WritingCourse
{
    public void AddStudent(StudentName sn, int f):
    base(sn, false){}

    public decimal CalculateIncome()
    {
       return //do stuff
    }
}

public class SewingCourse : Course
{
    public override void AddStudent(StudentName sn, int f)
    {
        //do stuff
    }

    public override decimal CalculateIncome()
    {
       return //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Roy*_* T. 7

如果我使派生的抽象类方法抽象Visual Studio说他们隐藏基类抽象然后具体类方法有错误说基类必须是抽象的(它必须但不能注册)

如果你的基类'A'有一个抽象方法'b()'那么你不必再将'b()'再次声明为B:A中的抽象,让C:B覆盖它,只是'使用它.即使你重写了B类中的'b()'方法,你也可以在类'c()'中重写它(甚至使用base.();来执行B的实现.

一些代码:

public abstract class A{
    public abstract void b();
}

public class B : A{
    public override void b() { //do stuff }; //overrides b from a
    public virtual void c() { //do stuff }; //creates an implemented method c in B that can be overriden by childs.
    public void d() { //do stuff};
}

public class C : B{
    public override void b() { //do stuff}; //overrides b from A, works!
    public override void c() {//do stuff}; //overrides c from B, works!
    public override void d() {//do stuff}; //doesn't work since d from B isn't abstract or virtual (hides it)
    public new void d() {//do stuff}; //works, hides d, but when you use inheritance this method will not be called, instead B's d() method will be called, only if you see C as  the specific class C this will work
}
Run Code Online (Sandbox Code Playgroud)

也澄清:声明抽象方法必须被重写(就像在一个接口,只能通过类的直接子声明抽象方法).声明为virtual的方法可以被覆盖,但不一定是.


Sea*_*man 0

如果我理解正确的话,我认为您想在要重写的抽象方法上使用“virtual”关键字?

如果您正在谈论类似“某些方法隐藏继承成员,如果打算隐藏,则添加 new 关键字”的错误,那么基本方法上的 virtual 和继承方法上的 override 就可以了:

public abstract class BaseClass
{
    public virtual void SomeMethod()
    {
    }
}


public abstract class InheritingClass : BaseClass
{
    public override void SomeMethod()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)