C# OOP 实践有关继承的混淆



我正在阅读我的 C# 编程课程材料之一。 我理解代码本身,但我不太明白为什么导师以这种方式组织课程。

namespace GradeBook
{

public delegate void GradeAddedDelegate(object sender, EventArgs args);
public class NamedObject 
{
public NamedObject(string name)
{
Name = name;
}
public string Name
{
get;
set;
}
}
public interface IBook
{
void AddGrade(double grade);
Statistics GetStatistics();
string Name { get; }
event GradeAddedDelegate GradeAdded;
}
public abstract class Book : NamedObject, IBook
{
public Book(string name) : base(name)
{
}
public abstract event GradeAddedDelegate GradeAdded;
public abstract void AddGrade(double grade);
public abstract Statistics GetStatistics();
}
public class DiskBook : Book
{
public DiskBook(string name) : base(name)
{
}
public override event GradeAddedDelegate GradeAdded;
public override void AddGrade(double grade)
{
using(var writer = File.AppendText($"{Name}.txt"))
{                
writer.WriteLine(grade);
if(GradeAdded != null)
{
GradeAdded(this, new EventArgs());
}
}
}
public override Statistics GetStatistics()
{
var result = new Statistics();
using(var reader = File.OpenText($"{Name}.txt"))
{
var line = reader.ReadLine();
while(line != null)
{
var number = double.Parse(line);
result.Add(number);
line = reader.ReadLine();
}
}
return result;
}
}

上面的代码片段是普通学生的成绩簿。

  1. NameObject定义了一个属性Name和一个初始值设定项,这很容易理解。
  2. 他把所有方法都放在一个接口IBook,还有另一个类叫做Book,它继承自NameObject类和接口IBook。 我假设他故意将属性和方法分开,事件。这是对的吗?
  3. Book类中,初始值设定项public Book(string name) : base(name)。 我知道基础正在定义引用类型。 我对name参数有点困惑。 它指的是NameObjectName的属性吗?
  4. DiskBook 是 Book 的子类,初始值设定项public Book(string name) : base(name)传递引用name作为最后一个。 此处的name是否也指 NameObject 中的name属性?

提前谢谢。

  1. 从逻辑上讲,很多事情都可能是NamedObject。 他说BookIBook,也是NamedObject。 想象一下添加一个Person类。 那Person会是一个NamedObject,但不是IBook。 因此,您可以重用基类,而无需将其绑定到Book

  2. 使用: base(name)call the constructor on the base class with this parameter. 因此,您可以确定NamedObject的构造函数将使用字符串值调用,并设置Name属性。 从Book构造函数中排除: base(name)将导致编译器错误,因为基类没有无参数构造函数。

  3. 以同样的方式,DiskBook使用: base(name)Book上调用构造函数,而构造函数又在NamedObject上调用构造函数。

相关内容

  • 没有找到相关文章

最新更新