我试着举一个尽可能简单的例子,但问题的本质至少对我来说是相当困惑的。
为了重用代码而不重复我自己的代码,我有一个接口(interface) IStudent
实现了另一个接口(interface) IPerson
。
interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
interface IStudent : IPerson
{
int StudentNumber { get; set; }
}
我有一个类实现IStudent
class Student : IStudent
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int StudentNumber { get; set; }
}
现在我有一个抽象类CommunityBase
,它有一个类型为IPerson
的字段
abstract class CommunityBase
{
public IPerson member;
public CommunityBase(IPerson member)
{
this.member = member;
}
public void ShowName()
{
Console.WriteLine(this.member.FirstName + " " + this.member.LastName);
}
}
我还有一个派生自 CommunityBase
的类,名为 University
。因为 University
是一个更具体的类,所以我想使用一个更具体的接口(interface)。所以代码如下:
class University : CommunityBase
{
public new IStudent member;
public University(IStudent member)
: base(member)
{
this.member = member;
}
public void ShowStudentNumber()
{
Console.WriteLine(this.member.StudentNumber);
}
}
为了使所有这些都起作用,应该为IStudent 成员
声明new
关键字。此外,我还需要在基类中分配一次 member
字段,然后在派生类中再次分配一次。
我想做的是在 CommunityBase
构造函数中分配一次 member
但这样我就不能使用 IStudent
中定义的属性或方法在 University
类中。
以上所有代码都按预期编译和工作,但我想知道是否有更简单易读的方法来做到这一点。据我了解,人们倾向于避免使用 new
关键字进行隐藏,如果我继续使用此代码,是否会出现任何潜在问题?
最佳答案
使您的 CommunityBase
类通用
abstract class CommunityBase<T> where T : IPerson
{
protected T _member;
public T Member { get return _member; }
public CommunityBase(T member)
{
_member = member;
}
public virtual void ShowName()
{
Console.WriteLine(_member.FirstName + " " + _member.LastName);
}
}
同时使 ShowName
成为虚拟的,这使得更多的具体类可以覆盖它。
class University : CommunityBase<IStudent>
{
public University(IStudent member)
: base(member)
{
}
public override void ShowName()
{
Console.WriteLine(_member.FirstName + " " + _member.LastName +
" Student-No. = " + _member.StudentNumber);
}
}
关于c# - 在 C# 中的每个派生类中都有一个更具体的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948457/