Вы можете «добавить класс к интерфейсу», хотя я должен заметить, что надеюсь, что я правильно понял, что вы имели в виду, потому что предложение не имеет никакого смысла.
Но давайте посмотрим, что выdid:
public class CustomClass { }
public interface IConn
{
CustomClass CC();
}
Здесь объявляется класс CustomClass
и интерфейс IConn
, а в интерфейсе вы объявляете метод CC
, который возвращает ссылку на CustomClass
object.
Пока все хорошо.
Затем вы пытаетесь реализовать интерфейс, и вот тут возникают ваши проблемы:
public class Conn : IConn
{
public CustomClass CC = new CustomClass();
}
Здесь компиляторпожаловаться:
CS0535 «Conn» не реализует элемент интерфейса «IConn.CC ()»
Причина в том, что в интерфейсе CC
это метод , но в классе, в котором вы пытались реализовать интерфейс, вы сделали CC
поле .
, чтобы интерфейс был успешным и легальнымреализуется классом, вы должны оба реализовать все члены интерфейса, и вы должныдополняйте их, используя один и тот же тип члена.
Так что, если вы объявите CC
как метод в интерфейсе, он должен быть реализован как метод в классе, это не обойдется.
Таким образом, вы можете просто изменить свой класс следующим образом:
public class Conn : IConn
{
public CustomClass CC()
{
return new CustomClass();
}
}
или, если вы работаете в более новой версии C #, где у вас есть члены с выражениями в выражениях, вы можете написать это так:
public class Conn : IConn
{
public CustomClass CC() => new CustomClass();
}
Это всего лишь несколько дополнительных символов от того, что у вас было.
Теперь, что, если я неправильно понял ваш вопрос, и вы действительно хотели, чтобы все разработчики вашего интерфейса реализовали поле?Ну, вы не можете этого сделать.
В интерфейсе вы можете только объявить свойства и методы, а не поля, не конструкторы или другие вещи.
Теперь, кроме того, выскажем так:
Вместо этого наследование интерфейса заставляет меня применить это:
public class Conn : IConn
{
CustomClass IConn.CC()
{
throw new NotImplementedException();
}
}
Я догадываюсь , что в то время, когда вы думали об этомбыл единственный законный способ реализовать этот метод, у вас все еще было поле, потому что вы не можете сделать открытый метод и полем, оба с одинаковым именем, это недопустимо:
public class Conn : IConn
{
public CustomClass CC = new CustomClass();
public CustomClass CC() => new CustomClass();
}
и вы получите это:
CS0102 Тип 'Conn' уже содержит определение для 'CC'
Однако, если вы вместо этого сделаете метод явнореализовать интерфейс, как это, он будет компилироваться:
public class Conn : IConn
{
public CustomClass CC = new CustomClass();
CustomClass IConn.CC() => new CustomClass();
}
Однако теперь у вас есть два члена с именем CC
, один из которых доступен только через интерфейс, и, вероятно, не то, чтоВы хотите.
Окончательные указания здесь.Если вы намереваетесь удерживать ссылку на CustomClass
, даже если эта ссылка создается внутри класса, реализующего IConn
, вам следует вместо этого объявить и реализовать CC
как свойство.
Однако, если вы хотите, чтобы каждый раз, когда вы «читали» CC
(читали свойство или вызывали метод, в зависимости от того, как вы решили объявить и реализовать его), вы получите новый экземпляр CustomClass
, то, по моему мнению, вы должны придерживаться метода.