2015-04-29 4 views
0

У меня есть этот абстрактный класс:Есть ли способ использовать импорт абстрактного класса в конкретном классе?

using TypeLib=some.type.library; 

namespace someSpace 
{ 
abstract class Creator 
{ 
    abstract public TypeLib.SomeObject createObject(); 
} 

} 

Вот конкретный класс:

using TypeLib=some.type.library; 

namespace someSpace 
{ 
class SpecialCreator:Creator 
{ 
    override public TypeLib.SomeObject createObject() 
    { 
    doSomethingSpecial(); 
    return new TypeLib.SomeObject(); 
    } 
} 

} 

Потому что я хочу реализовать Creator несколько различных способов, все из которых требует импортирующих some.type.library, потому что они должны возвращать TypeLib.someObject, есть ли способ, которым я могу просто иметь оператор using на некотором высоком уровне и унаследовать ли он все реализации? Когда я не указал оператор using в SpecialCreator(), у него не было доступа к TypeLib.

EDIT: Я думаю, что это не так, как вопрос duplicate directives. Я не пытаюсь консолидировать различные операторы using в один мастер using, который затем добавлю к множеству классов; вместо этого я хочу поместить один оператор using в родительский класс/файл заголовка/статический класс/etc, чтобы он мог быть доступен для многих классов без необходимости добавлять одну и ту же строку кода в каждый класс. Дайте мне знать, если я неправильно понял вопрос о дублирующих директивах.

+0

Нет. Вам необходимо явно включить использование в каждый файл .cs. – garryp

+0

Почему бы просто не создать новый тип, который происходит из TypeLib.SomeObject и использовать его в классах? Его неявно преобразуется обратно в базовый тип ... –

+0

Возможный дубликат [Дублирование с использованием директив в нескольких файлах] (http://stackoverflow.com/questions/24512894/duplicated-using-directives-in-multiple-files) –

ответ

0

Если вы не определяете все классы в одном файле.

+0

ваши ответы не являются ответами, особенно когда вы заявляете 'Pretty sure', это должен быть комментарий на мой взгляд – MethodMan

+0

Я не могу добавить комментарий из-за уровня репутации. Я отредактирую его. – tdi

+1

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

1

Это зависит. Если TypeLib используется только в функциональности базового класса, нет причин включать «using TypeLib»; в файлах, содержащих конкретные реализации.

Если желаемая архитектура предназначена для инкапсуляции TypeLib в абстрактном базовом классе, необходимость иметь оператор using является индикатором, что инкапсуляция была нарушена.

Martin Fowler может сказать, что требование «использовать» TypeLib во всех конкретных реализациях - это запах плотной связи между деревом классов под базовым классом и TypeLib. Использование класса адаптера может уменьшить сцепление, поместив все TypeLib в адаптер.

0

Это зависит от того, что вы пытаетесь сделать.

Если вы просто пытаетесь не добавлять это на каждую страницу вашего производного класса, вам будет лучше использовать шаблон экспорта Visual Studio (в меню «Файл»). Выберите шаблон элемента, и ваш добавленный шаблон появится в списке «Добавить»> «Новый элемент». Я думаю, это было бы чище.

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

namespace some.type.library; 
{ 
class SpecialCreator:Creator 
{ 
    override public SomeObject createObject() 
    { 
    doSomethingSpecial(); 
    return new SomeObject(); 
    } 
} 
} 

Вы также можете вместо этого, вывести класс в вашем someSpace имен из TypeLib.SomeObject (без тела для данного класса) и использовать этот новый класс, где бы вы использовали TypeLib.SomeObject

0

Вы могли бы «псевдоним «тип, создав дочерний класс для внутреннего использования. Например:

namespace Remote.Namespace 
{ 
    public class TypeLib 
    { 
     public class SomeObject 
     { 

     } 
    } 
} 

namespace Internal.Namespace 
{ 
    public class InternalTypeLibObject : Remote.Namespace.TypeLib.SomeObject 
    { 

    } 
} 

И теперь вы можете использовать InternalTypeLibObject без псевдоним пространства имен и приведение его в TypeLib.SomeObject.

Теперь недостатки:

Если вы хотите использовать конструктор в родительском классе, вам нужно будет предоставить зеркало конструкторы и вызвать base конструктор конструктора цепочки. Кроме того, если родительский класс запечатан, это не сработает.

Честно говоря, вы не должны слишком беспокоиться о небольшом наборе текста. Скрытие таких классов может привести к путанице и, вероятно, следует избегать, если у вас нет причин распространять этот тип.

0

using - это всего лишь синтаксический сахар, который не позволяет вам печатать имена квалифицированных типов каждый раз, когда вы вводите их. Это подсказка для компилятора для мест, где нужно искать имена типов.

Так что, если вы на самом деле не используете типы из TypeLib, вам не нужно добавлять оператор using в каждую реализацию, даже если некоторый базовый класс этой конкретной реализации использует его каким-то образом (т. Е. Вытекает из него). И даже если ваша конкретная реализация использует типы от TypeLib, вы можете избежать выписки using, указав полностью имена типов из этой библиотеки каждый раз.

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