Добавление к строке (созданной в базовом классе) в производных классах - PullRequest
0 голосов
/ 12 октября 2018

Так что это довольно специфический вопрос.

Предполагается, что у меня есть набор классов, которые генерируют разные строки.Единственное, что общего между ними, это то, что им требуется одинаковый «заголовок» в строке.

Я решил создать базовый класс для генерации заголовка, из которого они все получены.

internal abstract class StringBase
{
    public virtual string WriteString()
    {
        var headerString = "header";
        return headerString;
    }
}

Теперь для производного класса, который должен включать заголовок, но также добавить егособственная последующая строка.

internal class DerivedString : StringBase
{
    public override string WriteString()
    {
        var derivedString = // How would I best add the header and append more to it?
        return derivedString;
    }
}

Переопределение так, как это, очевидно, перезапишет то, что делает база WriteString(), так как я могу убедиться, что получу это?Может ли это быть чем-то вроде добавления неосновного метода в базу, который затем вызывает виртуальный метод со строкой заголовка в качестве параметра?

internal abstract class StringBase
{
    public void WriteHeader()
    {
        var headerString = "header";
        WriteString(headerString);
    }

    public virtual string WriteString(string headerString)
    {
        var derivedString = headerString.Append("whateverString");

        return string.empty;
    }
}

internal class DerivedString : StringBase
{
    public override string WriteString(string headerString)
    {
        var derivedString = headerString.Append("whateverString");

        return derivedString;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Для этого вы можете использовать ключевое слово base , например:

internal class DerivedString : StringBase
{
    public override string WriteString(string headerString)
    {
        var derivedString = base.WriteString().Append("whateverString");

        return derivedString;
    }
}
0 голосов
/ 12 октября 2018

Один из способов заставить его работать - использовать закрытое поле в базовом классе:

internal abstract class StringBase
{
    private string headerString = "header";
    public virtual string WriteString(String input=null)
    {
        return String.IsNullOrEmpty(input) ? headerString : headerString + input;

    }
}

, а затем вы можете вызвать метод из производных классов, передав параметр.

...