Как мне строго ввести свойство, определенное как интерфейс? - PullRequest
2 голосов
/ 17 августа 2011

Я пытаюсь строго ввести свойство объекта, которое было определено как интерфейс в интерфейсе. Вот мой образец

// interfaces
public interface IMyInterfaceA
{
    string A { get; set; }
    IMyInterfaceB B { get; set; }
}

public interface IMyInterfaceB
{
    string B { get; set; }
}

// POCOs
public class pocoOneB : IMyInterfaceB
{
    public B { get; set; }
    public C { get; set; }  // extending the poco with a non-interfaced property
}

public class pocoOneA : IMyInterfaceA
{
    string A { get; set; }
    pocoOneB B { get; set; }  // fails, can I strongly type an interface??
}

public class pocoTwoB : IMyInterfaceB
{
    public B { get; set; }
    public D { get; set; }  // extending the poco with a non-interfaced property
}

public class pocoTwoA : IMyInterfaceA
{
    string A { get; set; }
    pocoTwoB B { get; set; } // fails, can I strongly type an interface??
}

Проблема в том, что я не могу сделать

pocoOneB B { get; set; } // fails, can I strongly type an interface??

или

pocoTwoB B { get; set; } // fails, can I strongly type an interface??

несмотря на то, что они являются реализациями интерфейса, компилятор говорит, что я неправильно реализовал IMyInterfaceA ни в одном из этих документов. Я понимаю ошибку, однако я хотел бы знать, если есть способ строго ввести свойство, которое имеет интерфейс?

Одним из способов решения этой проблемы является то, что интерфейс IMyInterfaceA вообще не определяет свойства интерфейса IMyInterfaceB и не использует его в poco, однако я пытаюсь обеспечить реализацию этого свойства с помощью интерфейсов.

Основная причина, по которой мне нужно строго указывать свойства poco, заключается в том, что я использую JSON для стерилизации по проводам.

Спасибо за любые рекомендации.

Ответы [ 4 ]

2 голосов
/ 17 августа 2011
public interface IMyInterfaceA<TPoco>
   where TPoco : IMyInterfaceB
{     
   TPoco B { get; set; } 
} 

public class pocoOneA<TPoco> : IMyInterfaceA<TPoco>
  where TPoco : IMyInterfaceB
{     
   public TPoco B { get; set; }  // fails, can I strongly type an interface?? 
} 

или просто

public interface IMyInterfaceA
{     
   IMyInterfaceB B { get; set; } 
} 

public class pocoOneA : IMyInterfaceA
{     
   public IMyInterfaceB B { get; set; }  // fails, can I strongly type an interface?? 
} 
1 голос
/ 17 августа 2011
public interface IMyInterfaceA
{
    string A { get; set; }
    IMyInterfaceB B { get; set; }
}

Ваш интерфейс имеет IMyInterfaceB B, поэтому вы должны иметь одинаковую подпись в классе.

public class pocoOneA : IMyInterfaceA
{
    string A { get; set; }
    IMyInterfaceB B { get; set; }  // fails, can I strongly type an interface??
}

Но когда вы возвращаете объект, вы можете вернуть либо pocoOneB, либо pocoTwoB

0 голосов
/ 17 августа 2011

То, что вы хотите, это ковариантные типы возврата. IIRC никогда не превращался в C # - по крайней мере, в таком виде.

Вы можете смоделировать его, явно реализовав интерфейс и предоставив новое свойство в производном типе для строго типизированного возвращаемого значения.

Я не уверен, как это работает с вашей сериализацией.

// interfaces
public interface IMyInterfaceA
{
    string A { get; set; }
    IMyInterfaceB B { get; set; }
}

public interface IMyInterfaceB
{
    string B { get; set; }
}

// POCOs
public class pocoOneB : IMyInterfaceB
{
    public string B { get; set; }
    public string C { get; set; }  // extending the poco with a non-interfaced property
}

public class pocoOneA : IMyInterfaceA
{
    public string A { get; set; }
    IMyInterfaceB IMyInterfaceA.B{ get; set; }
    public pocoOneB B { get{ return new pocoOneB(); } set{} }  // fails, can I strongly type an interface??
}

public class pocoTwoB : IMyInterfaceB
{
    public string  B { get; set; }
    public string D { get; set; }  // extending the poco with a non-interfaced property
}

public class pocoTwoA : IMyInterfaceA
{
    public string A { get; set; }
    IMyInterfaceB IMyInterfaceA.B{ get; set; }
    public pocoOneB B { get{ return new pocoOneB(); } set{} }  // fails, can I strongly type an interface??
}
0 голосов
/ 17 августа 2011

Вам не нужно "строго печатать" свойство - интерфейс IMyInterfaceB должен предоставлять всю информацию, необходимую для работы потребителя IMyInterfaceA.Что вы можете сделать, так это вернуть свою собственность экземпляром типа MyInterfaceB:

private MyInterfaceB _myInterfaceB;

public IMyInterfaceB
{
    get { return _myInterfaceB; }
    set { _myInterfaceB = (MyInterfaceB)value; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...