защищенный или общедоступный конструктор для абстрактного класса? Есть ли разница?

Этот вопрос из любопытства. Есть ли разница между:

public abstract class MyClass
{
    public MyClass()
    {
    }
}

а также

public abstract class MyClass
{
    protected MyClass()
    {
    }
}

Спасибо.


person Marlon    schedule 26.12.2010    source источник


Ответы (3)


Они одинаковы для всех практических целей.

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

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
var constructor = typeof(MyClass).GetConstructor(flags, null, new Type[0], null);

Это найдет конструктор в одном случае, но не в другом.

person Mark Byers    schedule 26.12.2010

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

подробности см. здесь http://msdn.microsoft.com/en-us/library/ms182126.aspx

person Shekhar_Pro    schedule 26.12.2010
comment
@Shekhar: пожалуйста, не публикуйте ссылки MSDN на старые версии. Читатели, щелкнув ссылки в этом документе, перейдут к более старым версиям. - person John Saunders; 26.12.2010
comment
@Джон, о, спасибо за редактирование моего поста. Я забыл посмотреть версию на странице.... :P - person Shekhar_Pro; 26.12.2010
comment
Это не верно. У вас могут быть общедоступные конструкторы, но с точки зрения использования нет никакой разницы между общедоступным и защищенным конструктором в абстрактных классах. - person jakobbotsch; 26.12.2010
comment
Этот ответ неверен. У вас могут быть общедоступные конструкторы для абстрактных типов. У вас могут быть внутренние, защищенные, защищенные внутренние или частные конструкторы. Вы просто не можете вызывать их непосредственно в абстрактном типе — вы можете вызывать их только из производных неабстрактных типов. И все конструкторы, независимо от метода доступа, будут создавать экземпляры, а не только общедоступные конструкторы. И вы должны определить общедоступные конструкторы в абстрактных классах, если вы хотите, чтобы производные классы были публично созданы, поэтому это допустимый дизайн. - person Enigmativity; 26.12.2010
comment
неправильно спроектирован, сильно отличается от не может иметь. - person Ben Voigt; 26.12.2010
comment
@Enigmativity вы можете иметь, но это не очень хороший дизайн, что говорит ссылка - person Shekhar_Pro; 26.12.2010
comment
@Shekhar_Pro - я прочитал статью и думаю, что ее мнение очень субъективно. Я бы сказал, что для рефакторинга кода я должен иметь возможность вносить как можно меньше изменений, и, поскольку в практическом плане между публичными и защищенными конструкторами мало различий, то соблюдение этого хорошего дизайна усложняет рефакторинг. Если за дизайном нет серьезной причины, он кажется довольно хлипким. - person Enigmativity; 29.12.2010
comment
Это очень поздний пост, но если вы используете какие-либо подходы в стиле IOC или DI, наличие открытого конструктора в абстрактном классе действительно имеет смысл в определенных случаях, когда вы хотите свести к минимуму дублирование кода. - person code4life; 05.04.2013
comment
@code4life - Было бы здорово, если бы вы могли привести пример или опубликовать ссылку на пример. Ни в коем случае не копирую ваш комментарий, но мне интересно, что вы имеете в виду. - person Alex Jorgenson; 04.09.2013

С точки зрения будущего использования этого кода, нет никакой разницы.

person Mihran Hovsepyan    schedule 26.12.2010