简体   繁体   English

多个派生抽象类?

[英]Multiple derived abstract classes?

I have to create a Course Management System with course categories:我必须创建一个包含课程类别的课程管理系统:

Cooking, sewing and writing courses

cooking and writing each have 2 courses (Italian, seafood, creative write and business write). cookingwriting各有 2 门课程(意大利语、海鲜、创意写作和商务写作)。 This creates derived abstract:这将创建派生摘要:

abstract course -> abstract cooking -> concrete seafood

The abstract cooking and writing have common fields and some common methods, however they also have abstract methods that are abstract in the base class.抽象的烹饪和写作有共同的领域和一些共同的方法,但是它们也有抽象的方法,在基础 class 中是抽象的。

Can this be done in C#?这可以在 C# 中完成吗? If I make the derived abstract class methods abstract Visual Studio says they hide the base class abstract and then the concrete class methods have errors saying the base class must be abstract (it is but must not register). If I make the derived abstract class methods abstract Visual Studio says they hide the base class abstract and then the concrete class methods have errors saying the base class must be abstract (it is but must not register). I have looked for an answer.我一直在寻找答案。 I know single inheritance is used in C# but inheritance carries down the chain.我知道单个 inheritance 用于 C# 但 inheritance 沿链进行。 What is the best answer?最好的答案是什么?

Here is a code snippet - I hope it clarifies the problem:这是一个代码片段 - 我希望它可以澄清问题:

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

if I make the derived abstract class methods abstract Visual Studio says they hide the base class abstract and then the concrete class methods have errors saying the base class must be abstract (it is but must not register) if I make the derived abstract class methods abstract Visual Studio says they hide the base class abstract and then the concrete class methods have errors saying the base class must be abstract (it is but must not register)

If you have base class 'A' which has an abstract method 'b()' then you don't have to declare 'b()' again as abstract in B: A, to have C: B override it, just don't use it.如果你有基础 class 'A' ,它有一个抽象方法 'b()' 那么你不必在 B:A 中再次声明 'b()' 作为抽象,让 C:B 覆盖它,只是不要'不要使用它。 Even if you override the 'b()' method in class B you can again override it in class 'c()' (and even use base.(); to execute B's implementation.即使您覆盖 class B 中的 'b()' 方法,您也可以在 class 'c()' 中再次覆盖它(甚至使用 base.(); 来执行 B 的实现。

Some code:一些代码:

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
}

Also to clarify: methods declared abstract must be overriden (just like in an interface, and only by the direct child of the class declaring the abstract method).还要澄清:声明为抽象的方法必须被覆盖(就像在接口中一样,并且只能由声明抽象方法的 class 的直接子代)。 Methods declared virtual can be overriden, but don't have to be.声明为 virtual 的方法可以被覆盖,但不是必须的。

I think this kind of problems is better to resolve using interfaces and not abstract classes: Ex:我认为这种问题最好使用接口而不是抽象类来解决:例如:

//
interface IInterface1
{
    void SameMethod();
}

interface IInterface2
{
    void SameMethod();
}


class TestClass : IInterface1, IInterface2
{
    void IInterface1.SameMethod()
    {
        // do one thing for Interface 1
    }

    void IInterface2.SameMethod()
    {
        // do something elsefor Interface 2
    }
}

class Program
{
    static void Main(string[] args)
    {
        TestClass test = new TestClass();

        IInterface1 i1 = test;
        i1.SameMethod(); // will call IInterface1.SameMethod()

        IInterface2 i2 = test;
        i2.SameMethod(); // will call IInterface2.SameMethod()

    }
}
public class StudentName
{ }

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

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

public class BusinessWritCourse : WritingCourse
{
    override public void AddStudent(StudentName sn, int f)
    { base.AddStudent(sn, 0); }

    override public decimal CalculateIncome()
    {
        return (decimal)3.4;//do stuff
    }
}

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

    public override decimal CalculateIncome()
    {
        return (decimal)10; //do stuff
    }
}

class Program
{
    static void Main(string[] args)
    {

    }
}

If I understand correctly I think you'd want to use the 'virtual' keyword on abstract methods you want to override?如果我理解正确,我认为您想在要覆盖的抽象方法上使用“虚拟”关键字?

If you are talking about the error that says something like "some method hides inherited member, add the new keyword if hiding was intended", then virtual on the base method and override on the inheriting method will do:如果您正在谈论诸如“某些方法隐藏继承的成员,如果打算隐藏则添加新关键字”之类的错误,那么基方法上的虚拟和继承方法上的覆盖将执行以下操作:

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


public abstract class InheritingClass : BaseClass
{
    public override void SomeMethod()
    {
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM