Как создать класс без какого-либо конструктора, как класс MessageBox - PullRequest
2 голосов
/ 28 февраля 2012

Как я могу создать класс с нулевым конструктором, как класс MessageBox, у которого нет конструктора. Я не могу сделать этот класс статическим, потому что в нем объявлен публичный статический метод, и этот метод делает объект этого класса. в C # 3.5

я хочу сделать этот класс таким же, как класс System.Windows.Forms.MessageBox, в котором нет конструктора и при создании объекта этого класса возникает ошибка:

этот класс не имеет конструктора

где как класс с закрытым конструктором, когда объект создает ошибки -

конструктор недоступен из-за уровня защиты.

Ответы [ 7 ]

6 голосов
/ 28 февраля 2012

Единственный способ создать класс без конструктора - это использовать static class.

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

class Foo
{
    private Foo() { }

    public static Foo Create()
    {
        return new Foo(); // Only members of Foo can directly invoke the constructor.
    }
}

Если метод вне Foo в той же сборке пытается создать экземпляр Foo, то сообщением будет то, что конструктор недоступен из-за егоуровень защиты.Если вы попытаетесь получить к нему доступ из другой сборки, появится сообщение о том, что у Foo нет конструкторов.

2 голосов
/ 28 февраля 2012

Методы на MessageBox являются статическими ; Вы можете сделать это с помощью модификатора static:

public static class Foo {
    public static void Bar() {...}
}

, то:

Foo.Bar();

В более ранних версиях c # (до того, как static было разрешено на занятиях) вам приходилось обманывать:

public class Foo {
    private Foo() {} // hide the constructor
    public static void Bar() {...}
}
0 голосов
/ 28 февраля 2012

Если цель этого - не позволить пользователю создать новые экземпляры класса, вы можете сделать все конструкторы менее видимыми, чем общедоступными.

Например - защищен.

0 голосов
/ 28 февраля 2012

Рассмотрим использование шаблонов Creational, описанных в GOF ( "Gang Of Four" )

Существуют следующие способы:

1) Если вы хотите иметьтолько один экземпляр объекта, который нужно создать, используйте Singleton

Есть хороший пример поточно-ориентированного синглтона на MSDN

В этой стратегии экземпляр создается при первом обращении к любому члену класса

public sealed class Singleton
{
   private static readonly Singleton instance = new Singleton();

   private Singleton(){}

   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

2) Если вы не хотите указывать точный класс для создания, используйте Фабричный метод

Вот выдержка из статьи о C # -Corner Фабричный метод Проектирование шаблона с использованием C #

abstract class Factory 
    {
        public abstract Product GetProduct(); //Factory Method Declaration
    }

class concreteFactoryforProcuct1 : Factory
    {
        public override Product GetProduct() //Factory Method Implementation
            {
                return new Product1();
            }
    }

3) Если есть группаобъектов, которые будут созданы таким образом, используйте Абстрактная фабрика

Вот выдержки из статьи по codeproject: Понимание и реализация абстрактного фабричного шаблона в C #

Создание абстрактной фабрики

interface IPhoneFactory //'I' stands for interface no relation with Iphone
{
    ISmart GetSmart();
    IDumb GetDumb();
}

Создание бетонных фабрик

class SamsungFactory : IPhoneFactory
{
    public ISmart GetSmart()
    {
        return new GalaxyS2();
    }

    public IDumb GetDumb()
    {
        return new Primo();
    }
}
...

Создание клиента

enum MANUFACTURERS
{
    SAMSUNG,
    HTC,
    NOKIA
}
class PhoneTypeChecker
{
    IPhoneFactory factory;
    ...
    public PhoneTypeChecker(MANUFACTURERS m)
    {
        m_manufacturer= m;
    }

    public void CheckProducts()
    {
        switch (m_manufacturer)
        {
            case MANUFACTURERS.SAMSUNG:
                factory = new SamsungFactory();
                break;
            case MANUFACTURERS.HTC:
                factory = new HTCFactory();
                break;
            case MANUFACTURERS.NOKIA:
                factory = new NokiaFactory();
                break;
        }
        ...
        factory.GetSmart();
        factory.GetDumb();
        ...
    }
}

static void Main(string[] args)
{
    PhoneTypeChecker checker = new PhoneTypeChecker(MANUFACTURERS.SAMSUNG);
    checker.CheckProducts();

    ...
}

4) Используйте здравый смысл для разработки собственного дизайна, который бы удовлетворял ваши потребности.

0 голосов
/ 28 февраля 2012

Вы можете добавить публичные методы STATIC в ваш класс, и вы получите то же самое, что и в окне сообщения. Помните, что статические методы не могут получить доступ к нестатическим свойствам или методам в одном классе.

Надеюсь, это поможет.

0 голосов
/ 28 февраля 2012

Создание статического класса или класса с закрытым конструктором.

0 голосов
/ 28 февраля 2012

Сделайте это статическим классом без конструктора или сделайте его абстрактным классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...