2014-01-10 2 views
0

Мне нужно получить класс Tool, так как я должен украсить этот класс другим интерфейсом IToolWrapper. К сожалению, Tool класс не предоставляет конструктор копирования, поэтому я думаю, что никто не может написать застройщик в DerivedTool какИнициализировать базовый класс без конструктора экземпляра из конструктора производного класса

public DerivedTool(String filename) : base(createToolFromFile(filename)) { 
    //... 
} 

Хотя я был совершенно уверен, что это не будет работать, я попытался следующие:

public sealed class DerivedTool : Tool, IToolWrapper { 

    static bool createToolFromFile(ref Tool tool, String filename) { 
     tool.Dispose(); 
     tool = null; 
     try { 
      tool = LoadFromFile(filename) as Tool; 
     } catch (Exception) { 
      return false; 
     } 
     return true; 
    } 

    public DerivedTool(String filename) : base() { 
     Tool tool = (Tool)this; 
     if (!createToolBlockFromFile(ref tool, filename)) throw new Exception("Tool could not be loaded!"); 
    } 

} 

в отладчик, я понимаю, что tool как я локальной переменной в конструктор изменяется по мере необходимости (б/с в случае улова не введен), но базовая часть DerivedTool (т.е. Tool) не является пострадавшие. Как я могу достичь желаемого поведения?

+0

Мы не можем знать, как 'CogToolBlock' класс работает, лучше, чем вы, если мы не знаем об этом. – Jodrell

+1

Почему вы не создаете другой класс, который принимает экземпляр инструмента в конструкторе и реализует интерфейс, перенаправляя действия на предоставленный экземпляр инструмента? Вам нужно использовать новый класс в качестве замены готового инструмента, например. передать его методам, которые берут Инструмент в качестве параметра? – Markus

+0

@Matz: вопрос не совсем ясен ... можете ли вы объяснить немного подробно и четкий, чтобы мы могли помочь вам с идеальным решением. –

ответ

3

Используйте сочетание частной переменной и неявного/явного оператора, как, как показано ниже:

public sealed class DerivedTool : IToolWrapper { 
    private Tool _tool; 

    public DerivedTool(String filename) : base() { 
     _tool = LoadFromFile(filename) as Tool; 
    } 

    public static implicit operator Tool(DerivedTool dt) 
    { 
     return dt._tool; 
    } 
} 
+0

Звучит разумно и работает - в моем случае. Благодарю. – Matz

Смежные вопросы