C#具有相同方法的子类
我有一个超类和两个子类。这两个子类都有一个检查章节是否包含内容的方法。对于子类1,此方法为HasContent(int chapterID),对于子类2,此方法为HasContent(int chapterID,int institution)。如您所见,子类2有一个额外的参数。这两种方法的目的是相同的 我正在考虑将方法HasContent放入超类中。你认为我需要这样做吗?如果是,我应该如何实施?还是将这两种方法放在它们自己的子类中更明智 编辑: HasDocuments的主体如下所示: 第1款:C#具有相同方法的子类,c#,methods,subclass,C#,Methods,Subclass,我有一个超类和两个子类。这两个子类都有一个检查章节是否包含内容的方法。对于子类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。不客气。顺便说一句,除非这些方法与对象本身有关,否则您可能应该将它们设置为静态。