EDIT Ive перефразировать вопрос, так что лучше отражает то, что им пытаются сделатьКак удалить дублирование кода при реализации интерфейсов, которые совместно используют общие методы
Я пытаюсь создать набор классов, которые все унаследует от 1 «суперкласс» или «базовый класс».
Однако я ищу способ реализовать код для каждого метода, в каждом отдельном классе, так как кажется, что это много дублирования.
Вот супер класс:
public abstract class WebObject
{
string Id { get; set; }
string Name { get; set; }
public void Click() { Console.WriteLine("Clicking object"); }
public string GetAttribute() { return "An attribute"; }
public void SetAttribute(string attribute, string value)
{
//code to set attribute
}
}
Я также создал несколько интерфейсов:
interface IReadable
{
string GetText();
}
interface IWriteable
{
void SetText(string value);
}
Вот пример производный класс:
public class TextBox: WebObject, IWriteable, IReadable
{
}
Конечно приведенный выше класс содержит ошибку. Он не реализует IWriteable или IReadable.
Так что я мог бы сделать что-то вроде:
public class TextBox: WebObject, IWriteable, IReadable
{
public void SetText(string value)
{
//Implemented code
}
public string GetText()
{
//Implemented code
return "some value";
}
}
Какой бы компилировать штраф ... Однако проблема здесь заключается в том, что SetText и GetText содержат много кода. Я не хочу копировать это каждый раз, когда хочу реализовать этот метод. Id, а просто написать код один раз и вызвать его в любое время, когда мне нужно использовать этот метод.
Я знаю, что мы не можем много наследовать на C# и Java. Так что моя оригинальная мысль была просто создать набор статических классов с кодом для SetText и GetText Показанные здесь:
public static class Setter
{
public static void SetText(string value)
{
//Code to set text
}
}
public static class Getter
{
public static string GetText()
{
//Code to get text
return "";
}
}
Затем меняющегося мой класс TextBox к следующему:
public class TextBox: WebObject, IWriteable, IReadable
{
public void SetText(string value)
{
Setter.SetText(value);
}
public string GetText()
{
return Getter.GetText();
}
}
Я не могу помочь, но чувствую, что это довольно длинное ветреное решение. Он выполняет то, что я хочу в том, что TextBox имеет ванильные методы, плюс 2 он реализует сам.
Но мой вопрос: могу ли я достичь той же цели, используя более сжатый дизайн?
Сноски
Каждый объект фактически реализует несколько общих методов. Возьмите TextBox, ComboBox и SelectBox, все они должны иметь возможность SetText, однако только CombBox и SelectBox должны иметь возможность использовать Select.
Это не сработает, если вы достигнете какого-либо состояния. – SLaks
Что делают 'SetText' и' GetText'? Если у вас есть статическая реализация для них, зачем вам нужны методы экземпляра, которые делают то же самое? – Blorgbeard
Возможно, вы можете переместить часть своего кода в проект на C++. Там вы можете иметь множественное наследование и выставлять интерфейсы ... – Caverna