import java.util.Stack;
class Demo
{
char c;
public boolean checkParan(String word)
{
Stack<Character> sta = new Stack<Character>();
for(int i=0;i<word.length();i++)
{
c=word.charAt(i);
if(c=='(')
{
sta.push(c);
System.out.println("( Pushed into the stack");
}
else if(c=='{')
{
sta.push(c);
System.out.println("( Pushed into the stack");
}
else if(c==')')
{
if(sta.empty())
{
System.out.println("Stack is Empty");
return false;
}
else if(sta.peek()=='(')
{
sta.pop();
System.out.println(" ) is poped from the Stack");
}
else if(sta.peek()=='(' && sta.empty())
{
System.out.println("Stack is Empty");
return false;
}
}
else if(c=='}')
{
if(sta.empty())
{
System.out.println("Stack is Empty");
return false;
}
else if(sta.peek()=='{')
{
sta.pop();
System.out.println(" } is poped from the Stack");
}
}
else if(c=='(')
{
if(sta.empty())
{
System.out.println("Stack is empty only ( parenthesis in Stack ");
}
}
}
// System.out.print("The top element is : "+sta.peek());
return sta.empty();
}
}
<ч> public class ParaenthesisChehck {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Demo d1= new Demo();
// d1.checkParan(" ");
// d1.checkParan("{}");
//d1.checkParan("()");
//d1.checkParan("{()}");
// d1.checkParan("{123}");
d1.checkParan("{{{}}");
}
}
Сегодня в MEF нет «встроенной» поддержки для этого, но, прежде чем вернуться к Service Locator, вы можете найти кое-что для вдохновения здесь: http: //blogs.msdn. com / nblumhardt / archive / 2008/12/27 / container-managed-application-design-prelude-where-does-the-container-own.aspx
Основная идея состоит в том, что вы «импортируете» контейнер в компонент
Мы изучаем более прямую поддержку этого сценария.
Ник
ОБНОВЛЕНИЕ: MEF теперь имеет экспериментальную поддержку для этого. См. это сообщение в блоге для получения дополнительной информации.
Я не уверен, что это то, о чем говорит Николас, но вы могли бы импортировать класс Factory, а не класс экземпляра, например:
[Import(typeof(ILedPanelFactory)]
public ILedPanelFactory PanelFactory { get; set; }
... а затем позже в вашем коде ...
ILedPanel panel = PanelFactory.BuildPanel();
Я думаю, вы имеете в виду, что хотите использовать MEF в этом случае как локатор службы, а не контейнер для внедрения зависимостей. Посмотрите примеры для ValueResolver
Ищу в образце игры с фигурами, который поставляется с MEF, есть класс ShapeFactory:
[Export]
public class ShapeFactory
{
private readonly Random random = new Random((int)DateTime.Now.Ticks);
[Import]
private ICompositionService CompositionService { get; set; }
public IShape GetRandomShape()
{
var shapeRetriever = new ShapeRetriever();
CompositionService.SatisfyImports(shapeRetriever);
int randomIndex = random.Next(shapeRetriever.PossibleShapes.Length);
return shapeRetriever.PossibleShapes[randomIndex].GetExportedObject();
}
private class ShapeRetriever
{
[ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
public Export<IShape, IShapeMetadata>[] PossibleShapes { get; set; }
}
}
, который демонстрирует создание экземпляров случайных фигур «по запросу» ... Я бы подумал, что в вашем сценарии вы могли бы сделать что-то подобное без выбора случайного реализация, как вы предполагаете, будет зарегистрирована только одна реализация ILedPanel.
Если я не неправильно понимаю вопрос, похоже, что он будет решен простым использованием CreationPolicy.NonShared.
Предполагается, что код, объявляющий Panel, существует везде, где вы хотите создать панель. Вы получите новый экземпляр ILedPanel в каждом экземпляре каждого класса, имеющего это объявление (импорт).