所以,我有下面的方法,它是set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
类的一部分,基本上是一个2d字符数组。我打算有几个行为略有不同的子类,知道如何以不同的方式填充自己。
有问题的方法应该在数组中插入一个字符串。为了避免溢出错误,我需要检查数组中是否有空间。检查这是否足够空间很简单,但这就是问题的开始。
如果没有足够的空间,我希望每个子类定义它将如何处理该行为。 (例如,一些子类将在开始时重新开始,其他子类将不执行任何操作并停止插入字符,其他子类将删除顶行,将所有内容移动,并将其写入底部的新空白行,其他人将放弃并使程序崩溃等。)
请参阅以下代码中的注释。我想我想abstract
实现,但有没有办法可以覆盖else分支,还是我必须将整个方法移动到子类中?
(override
是类中的私有方法。)
IsEnoughRoom
答案 0 :(得分:1)
您的抽象类可以采用另一种方法。方法是virtual
,它可以返回枚举值以确定结果是什么,让调用者完成剩下的工作。整个调用者可以是派生类。
让我们看看这个解决方案:
public enum CharInsertionResult
{
Success,
NoRoom
}
public abstract class CharInserter
{
internal virtual CharInsertionResult InsertString(string stringToInsert, int xStart, int yStart)
{
char[] charsToInsert = stringToInsert.ToCharArray();
int currentXPosition = xStart;
int currentYPosition = yStart;
// For each character in the array of charsToInsert,
for (int i = 0; i < charsToInsert.Length; i++)
{
// Check if there is enough room...
if(isEnoughRoom(xStart, yStart, charsToInsert))
{
SetCharAt(currentXPosition, currentYPosition, charsToInsert[i]);
if (currentXPosition < xSize - 1)
{
currentXPosition++;
}
else
{
currentXPosition = 0;
currentYPosition++;
}
return CharInsertionResult.Success
}
else
{
return CharInsertionResult.NoRoom;
}
}
}
}
现在派生类可以覆盖抽象类&#39;实施以提供CharInsertionResult.NoRoom
案例的解决方案:
public class SpecializedCharInserter : CharInserter
{
internal override CharInsertionResult InsertString(string stringToInsert, int xStart, int yStart)
{
CharInsertionResult result = base.InsertString(stringToInsert, xStart, yStart);
switch(result)
{
case CharInsertionResult.NoRoom:
// Do stuff here to handle this scenario
break;
default:
return result;
}
}
}
恕我直言,我相信这是一个很好的设计,因为如果你不想处理NoRoom
场景,你就不需要覆盖一个方法,否则,你就是&#39;一个可扩展点,在派生类中这样做。