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

标签 c# inheritance interface member-hiding

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

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

相关文章:

java - Dropbox Djinni - Java 接口(interface)与类扩展

java - 我真的需要在 Spring 中创建接口(interface)吗?

c# - 如何高效画百点,C#/XAML

c# - 像在 MS Paint 中一样调整位图大小

c# - 与 OOP 中的抽象概念相关的问题

c# - 如何适配Grid导出Excel的列宽?

class - 在示例中阅读 Scala,试图理解示例背后的哲学

java - 获取类的所有方法的新方法是什么,包括 Java 8 的继承默认方法?

android - 使用 Sugar ORM 继承

用于接口(interface)和实现接口(interface)的类的 PhpDoc - 区别