C#:如何构造这个被覆盖的方法

时间:2016-09-19 19:15:59

标签: c# oop error-handling override abstract-class

所以,我有下面的方法,它是set hive.stats.fetch.column.stats=true; set hive.stats.fetch.partition.stats=true; 类的一部分,基本上是一个2d字符数组。我打算有几个行为略有不同的子类,知道如何以不同的方式填充自己。

有问题的方法应该在数组中插入一个字符串。为了避免溢出错误,我需要检查数组中是否有空间。检查这是否足够空间很简单,但这就是问题的开始。

如果没有足够的空间,我希望每个子类定义它将如何处理该行为。 (例如,一些子类将在开始时重新开始,其他子类将不执行任何操作并停止插入字符,其他子类将删除顶行,将所有内容移动,并将其写入底部的新空白行,其他人将放弃并使程序崩溃等。)

请参阅以下代码中的注释。我想我想abstract实现,但有没有办法可以覆盖else分支,还是我必须将整个方法移动到子类中?

override是类中的私有方法。)

IsEnoughRoom

1 个答案:

答案 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;一个可扩展点,在派生类中这样做。