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

我正在考虑将方法HasContent放在超类中。你觉得我需要这样做吗?如果是这样,我该如何实现呢?或者将两个方法放在他们自己的子类中更明智?

编辑:

HasDocuments的主体如下所示: Subclass1:

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

if (res > 0)
    return true;
else
    return false;

Subclass2:

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时,它将使用与您提供的参数的数量和类型相匹配的任何一个。因为它位于超类中,所以如果您稍后决定创建一个使用此方法的新子类,则现在不必再制作它的另一个副本。请参阅下面的示例代码;

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;
}

你说:

  

两种方法的目的是相同的

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

由于HasContent()采用不同的扩充,我不会将其移动到基类,事实上两个方法被称为相同,并不意味着它们做同样的事情。

我不知道你的代码库或你正在处理的系统是什么,但是鉴于我所掌握的信息很少,关于你的设计的一些事情感觉 wronge。我在过去发现,当我遇到这种设计问题时,往往是由于其他问题,数据是如何建模的。抱歉,如果您无法更改系统的其余部分,请不要匹配帮助…。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top