2017-01-27 16 views
-2

Обновление: Мой первоначальный план состоял в том, чтобы использовать его для повышения и понижения. Я просто хотел, чтобы мой метод мог возвращать разные классы на основе разных ответов с сервера.Как использовать интерфейс для доступа к классам, которые его реализовали?

Я пытаюсь понять расширенное использование интерфейса. Допустим, у меня есть лицо, как среди ниже:

public interface IMyInterface 
{ 

} 

У меня есть два класса, реализующие вышеуказанный интерфейс, как сильфона.

public class A:IMyInterface 
{ 
    public string AName { get; set; } 
} 

public class B : IMyInterface 
{ 
    public string BName { get; set; } 
} 

Теперь у меня есть четыре метода, как показано ниже:

public IMyInterface CreateRawResponse() 
{ 
    if (condition) 
    { 
     return new A 
     { 
      AName = "A" 
     }; 
    } 
    else 
    { 
     return new B 
     { 
      BName = "B" 
     }; 
    } 
} 

public string CreateResponse(IMyInterface myInterface) 
{ 
    return myInterface. // I would like to access the properties of the  parameter, since its actually a class 
} 
public string CreateResponseForA(A a) 
{ 
    return a.AName; 
} 

public string CreateResponseForB(B b) 
{ 
    return b.BName; 
} 

Наконец я пытаюсь вызвать методы, как это:

var obj = new Program(); 
var KnownResponse = obj.CreateRawResponse(); // Lets say I know I will get type A 
var test1 = obj.CreateResponseForA(KnownResponse); //But I can't call like this, because CreateResponseForA() is expecting IMyInterface as parameter type. 
var UknownResponse = obj.CreateRawResponse(); // Lets say I don't know the response type, all I know is it implemented IMyInterface 

var test2 = obj.CreateResponse(UknownResponse); // I can call the method but can access the properties of the calling type in CreateResponse() mehtod. 

Как справиться с такой ситуацией? Я считаю, что может быть какой-то шаблон проектирования, чтобы решить эту проблему, но я не привык к разработке шаблонов. Любые советы были бы очень полезными.

+0

Если вы хотите свойство быть доступны в интерфейсе, добавьте его к этому интерфейсу. –

+0

пусть интерфейс имеет общий интерфейс 'property IMyInterface {string Name {get; }} ' – Nkosi

+0

Ваш интерфейс пуст. Он должен иметь доступное свойство, которое является общим для классов, которые его реализуют, чтобы оно использовалось так, как вы хотите. В противном случае ваш интерфейс просто бессмысленен. –

ответ

2

Интерфейс должен иметь элемент, общий для всех, которые реализуют его

public interface IMyInterface { 
    string Name { get; set; } 
} 

Таким образом

public class A:IMyInterface 
{ 
    public string Name { get; set; } 
} 

public class B : IMyInterface 
{ 
    public string Name { get; set; } 
} 

Что тогда означает, что вы ситуация становится.

public IMyInterface CreateRawResponse() 
{ 
    if (condition) 
    { 
     return new A 
     { 
      Name = "A" 
     }; 
    } 
    else 
    { 
     return new B 
     { 
      Name = "B" 
     }; 
    } 
} 

public string CreateResponse(IMyInterface myInterface) 
{ 
    return myInterface.Name; 
} 
public string CreateResponseForA(A a) 
{ 
    return a.Name; 
} 

public string CreateResponseForB(B b) 
{ 
    return b.Name; 
} 

которые также могут быть затем переработан в

public string CreateResponse(IMyInterface myInterface) 
{ 
    return myInterface.Name; 
} 
public string CreateResponseForA(A a) 
{ 
    return CreateResponse(a); 
} 

public string CreateResponseForB(B b) 
{ 
    return CreateResponse(b); 
}