我必须创建一个课程管理系统,其中包含课程类别:
Cooking, sewing and writing courses
cooking
和writing
各有2门课程(意大利语,海鲜,创意写作和商务写作)。这会创建派生的摘要:
abstract course -> abstract cooking -> concrete seafood
抽象的烹饪和写作有共同的领域和一些常用的方法,但它们也有抽象的方法在基类中是抽象的。
可以用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
}
}
答案 0 :(得分: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
}
另外要澄清:声明为abstract的方法必须被覆盖(就像在接口中一样,并且只能由声明抽象方法的类的直接子节点)。声明为虚拟的方法可以被覆盖,但不一定是。
答案 1 :(得分:4)
我认为使用接口而不是抽象类来解决这类问题会更好: 例如:
//
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()
}
}
答案 2 :(得分:1)
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)
{
}
}
答案 3 :(得分:0)
如果我理解正确,我认为您想要在要覆盖的抽象方法上使用'virtual'关键字?
如果你所说的错误是“某些方法隐藏了继承的成员,如果隐藏意图就添加新的关键字”,那么基础方法上的虚拟和继承方法的覆盖将会:
public abstract class BaseClass
{
public virtual void SomeMethod()
{
}
}
public abstract class InheritingClass : BaseClass
{
public override void SomeMethod()
{
}
}