#c# #oop #interface
#c# #ооп #интерфейс
Вопрос:
Сразу перехожу к вопросу.
Сценарий-Шаги:
1) Я определяю интерфейс
IMathBase
{
void Add(int a , int b);
void Sub(int a, int b);
}
2) Конкретный класс PlusMinus
реализует IMathBase
.
3) Конкретный класс PlusMinusDiv
реализует IMathBase
. PlusMinusDiv
добавляет еще одну функцию void Div(int a, int b)
4) IMathBase mathBase = new PlusMinusDiv();
5) mathBase.Div(10,20)
;
Я знаю, что шаг 5 недействителен. Каков наилучший способ справиться с описанной выше ситуацией [добавить новый метод в конкретный класс, который реализует общий интерфейс]?
Заранее благодарю.
С уважением,
Джо
Комментарии:
1. Есть ли причина, по которой вы используете указатель, вы имеете в виду, что это происходит в небезопасном блоке кода, и есть ли причина, по которой вы не можете просто использовать обычные ссылки c #.
2. @rerun. Спасибо, что указали на это. Удалено * . 🙂
Ответ №1:
Либо
PlusMinusDiv mathBase = new PlusMinusDiv();
mathBase.Div(10,20);
или
IMathBase mathBase = new PlusMinusDiv();
((PlusMinusDiv)mathBase).Div(10,20);
Ответ №2:
Либо добавьте новый метод в интерфейс и реализуйте его во всех конкретных классах, либо присвоите вашей переменной тип PlusMinusDiv, а не IMathBase. Правильный ответ зависит только от потребностей вашего приложения.
Ответ №3:
Есть несколько способов, которыми вы могли бы справиться с этим, вы могли бы:
1. Просто добавьте новый метод в определение интерфейса и обновите все существующие реализации.
2.As выше, но используйте абстрактный базовый класс, который может обеспечить реализацию по умолчанию. Таким образом, любые существующие реализации, которые наследуются от вашего абстрактного базового класса, не будут прерываться и могут при необходимости переопределять реализацию, предоставляемую базовым классом.
3. Используйте метод расширения, например:
public static int Div(this IMathBase mathBase, int a, int b) {
return (a / b);
}
int result = mathBase.Div(20, 10);
Ответ №4:
Если вы вызываете метод Div, который не был определен в интерфейсе, то вы должны знать о существовании этого метода и контексте, в котором вы планируете его использовать.
Я бы сказал, что на ваш вопрос нет конкретного ответа, потому что вы не предоставили достаточно подробностей. Может случиться так, что реализация другого интерфейса с определенным методом Div будет идеальной для вас. Или, может быть, контекст очень прост, и вы можете просто создать экземпляр вашего класса с указателем точного типа.
Ответ №5:
Интерфейсы в C # поддерживают наследование. Итак, вы можете добавить новый интерфейс, такой как IDivMath, который наследуется от IMathBase, как в этом примере:
public interface IMathBase
{
void Sub(int x, int y);
void Add(int x, int y);
}
public interface IDivMath : IMathBase
{
void Div(int x, int y);
}
Итак, просто попросите ваш класс реализовать интерфейс IDivMath, который включает методы в IMathBase:
public class PlusMinusDiv() : IDivMath
{
public void Div(int x, int y)
{}
public void Add(int x, int y)
{}
public void Sub(int x, int y)
{}
}
и вы можете ссылаться на свой класс, используя любой интерфейс, в зависимости от того, как вы планируете использовать класс:
IMathBase* mathBase = new PlusMinusDiv();
IDivMath* divMath = new PlusMinusDiv();
Ответ №6:
Если вы запускаете его в .Net 4, вы также можете сделать:
dynamic mathBase = new PlusMinusDiv();
mathBase.Div(10,20);
который более или менее совпадает с
PlusMinusDiv mathBase = new PlusMinusDiv();
mathBase.Div(10,20);