gpt4 book ai didi

c# - 在 C# 中的每个派生类中都有一个更具体的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:12:29 26 4
gpt4 key购买 nike

我试着举一个尽可能简单的例子,但问题的本质至少对我来说是相当困惑的。

为了重用代码而不重复我自己的代码,我有一个接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com