C#具有相同方法的子类

C#具有相同方法的子类,c#,methods,subclass,C#,Methods,Subclass,我有一个超类和两个子类。这两个子类都有一个检查章节是否包含内容的方法。对于子类1,此方法为HasContent(int chapterID),对于子类2,此方法为HasContent(int chapterID,int institution)。如您所见,子类2有一个额外的参数。这两种方法的目的是相同的 我正在考虑将方法HasContent放入超类中。你认为我需要这样做吗?如果是,我应该如何实施?还是将这两种方法放在它们自己的子类中更明智 编辑: HasDocuments的主体如下所示: 第1款

我有一个超类和两个子类。这两个子类都有一个检查章节是否包含内容的方法。对于子类1,此方法为HasContent(int chapterID),对于子类2,此方法为HasContent(int chapterID,int institution)。如您所见,子类2有一个额外的参数。这两种方法的目的是相同的

我正在考虑将方法HasContent放入超类中。你认为我需要这样做吗?如果是,我应该如何实施?还是将这两种方法放在它们自己的子类中更明智

编辑:

HasDocuments的主体如下所示: 第1款:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID);

if (res > 0)
    return true;
else
    return false;
第2款:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID);

if (res > 0)
    return true;
else
    return false;
你说:

这两种方法的目的是相同的


是的,听起来你有一个可以放入超类的常用方法。

编辑:根据问题更新进行更新

由于两种方法中的逻辑显然几乎相同,因此我将对其进行如下重构:

abstract class SuperClass
{
    protected bool HasContentImpl(int chapterID, int institution)
    {
        Database db = new Database();
        int result;

        if (institution >= 0) // assuming negative numbers are out of range
            result = db.ExecuteSpRetVal(chapterID, institution);
        else
            result = db.ExecuteSpRetVal(chapterID);

        return result > 0;
    }
}

class SubClass1 : SuperClass
{
    public bool HasContent(int chapterID)
    {
        return base.HasContentImpl(chapterID, -1);
    }
}

class SubClass2 : SuperClass
{
    public bool HasContent(int chapterID, int institution)
    {
        return base.HasContentImpl(chapterID, institution);
    }
}
由于HasContent()进行了不同的扩充,我不会将其上移到基类,两个方法调用相同的事实并不意味着它们做相同的事情


我不知道你的代码库,也不知道你正在使用的系统是做什么的,但是考虑到我掌握的信息很少,你的设计有些地方感觉不对劲。我发现,在过去,当我遇到这种设计问题时,通常是由于数据是如何建模的问题。很抱歉,如果无法更改系统的其余部分,则无法匹配帮助….

请将两个具有不同参数的同名方法放置到超类中,以使用方法重载。当您调用HasContent时,它将使用与您提供的参数数量和类型匹配的参数。因为它在超类中,如果您以后决定创建一个也使用此方法的新子类,那么您现在就不必再复制它了。参见下面的示例代码

protected bool HasContent(int chapterID, int institution)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID, institution);

    return result > 0;
}

protected bool HasContent(int chapterID)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID);

    return result > 0;
}

所以你建议把身体放在子类里?为什么public bool HasContent(int chapterID,int institution)是公共的?是的,我是公共的,除非在实现中有一些共同点。我刚刚看到你的编辑,所以我会相应地更新我的答案。为什么HasContent重载是公共的?因为我假设您想从其他类调用它!:)Okee,但在子类2中,可能不会调用public override bool HasContent(int chapterID),因为需要institutionId。不客气。顺便说一句,除非这些方法与对象本身有关,否则您可能应该将它们设置为静态。