Абстрактный конструктор класса в C # - PullRequest
3 голосов
/ 14 октября 2010

В c # мы не можем создать объект из абстрактного класса или интерфейса, это означает, что у абстрактного класса нет конструктора, верно?или если есть, то какова его цель?

Ответы [ 5 ]

13 голосов
/ 14 октября 2010

Как уже говорили другие, абстрактные классы обычно имеют конструкторы (либо явно, либо класс по умолчанию, созданный компилятором), и любой конструктор производного класса должен будет проходить через конструктор абстрактного класса обычным способом.Это важный бит ... предположим, у вас есть абстрактный класс, в котором хранится имя, связанное с экземпляром, - потому что вы всегда хотите имя и не хотите записывать свойство Name в каждомконкретный производный класс.Вы можете предоставить конструктор, который берет это имя и присваивает его полю ... и тогда каждому конструктору подкласса придется пройти через этот конструктор, чтобы вы все еще знали, что у вас всегда будет имя.Если вы хотите узнать больше о цепочке конструктора, прочитайте мою статью о ней .

Вот пример этого:

public abstract class DemoBase
{
    private readonly string name;    
    public string Name { get { return name; } }

    protected DemoBase(string name)
    {
        this.name = name;
    }

    // Abstract members here, probably
}

public class FixedNameDemo : DemoBase
{
    public FixedNameDemo()
        : base ("Always the same name")
    {
    }

    // Other stuff here
}

public class VariableNameDemo : DemoBase
{
    public VariableNameDemo(string name)
        : base(name)
    {
    }

    // Other stuff here
}

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

public abstract class ArithmeticOperator
{
    public static readonly ArithmeticOperator Plus = new PlusOperator();
    public static readonly ArithmeticOperator Minus = new MinusOperator();

    public abstract int Apply(int x, int y);

    private ArithmeticOperator() {}

    private class PlusOperator : ArithmeticOperator
    {
        public override int Apply(int x, int y)
        {
            return x + y;
        }
    }

    private class MinusOperator : ArithmeticOperator
    {
        public override int Apply(int x, int y)
        {
            return x - y;
        }
    }
}

В этом отношении абстрактный закрытый метод / свойство может иметь смысл - к нему может обращаться базовый класс, но он предоставляетсяпроизводные классы в тексте программы того же класса.Однако это запрещено спецификацией.Обычно protected абстрактные члены решают ту же проблему, но не всегда.

7 голосов
/ 14 октября 2010

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

В любом объектно-ориентированном языке, таком как C #, построение объектов - это иерархический процесс.Посмотрите на код ниже.Когда вы создаете экземпляр любого объекта типа DerivedClass, он должен сначала создать базовый объект, прежде чем создавать объект типа DerivedClass.Здесь базовый класс может быть или не быть абстрактным классом.Но даже когда вы создаете экземпляр объекта конкретного типа, производного от абстрактного класса, ему все равно потребуется вызвать конструктор класса Base перед созданием объекта типа DerivedClass, поэтому вам всегда нужен конструктор для класса Abstract.Если вы не добавили никакого конструктора, компилятор C # автоматически добавит открытый конструктор без параметров в класс в сгенерированном MSIL.

public class BaseClass
{
    public BaseClass() 
    {
        Console.WriteLine("BaseClass constructor called..");
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
        Console.WriteLine("DerivedClass constructor called..");
    }
}

DerivedClass obj = new DerivedClass();

//Output
//BaseClass constructor called..
//DerivedClass constructor called..

PS : Предполагается, что если базовым классам Abstract не разрешено иметь конструкторы, поскольку их не требуется создавать, все основы объектно-ориентированного программирования будут продолжены.жеребьевка.Идея, лежащая в основе абстрактных типов, состоит в том, чтобы представлять объекты, которые имеют некоторые особенности и поведение, но не завершены как единое целое, чтобы обеспечить независимое существование.

4 голосов
/ 14 октября 2010

Нет. это означает, что оператор new не может создавать объекты из этого типа класса.

Целью может быть то, что выделяются / инициализируются некоторые свойства класса.

Аннотация обычно оставляет некоторые методы для реализации.

Что касается интерфейса, эта структура содержит только сигнатуры метода, делегатов или событий. Это может быть реализовано в классе, который использует интерфейс. Вы не можете создать объект.

Читать о новый

РЕДАКТИРОВАТЬ:

Какова цель конструктора в абстрактном классе?

Когда один класс наследует другой класс, его родительский класс должен быть создан первым, пока объект создается. В классе не реализован какой-то специальный конструктор, всегда используется по умолчанию один [className ()]. Когда вы переопределяете какой-либо метод, реализация функциональности берется из класса, который переопределяет метод. Вот почему метод, используемый в конструкторе, никогда не должен быть виртуальным. Та же логика для абстрактного класса, такой класс может иметь много функций и только один метод, который должен быть реализован дочерним классом.

2 голосов
/ 14 октября 2010

Абстрактные классы имеют конструкторы, но вы не можете вызывать их напрямую, поскольку вы не можете напрямую создавать экземпляры абстрактных классов.

Чтобы ответить на ваш комментарий, концепция частного абстрактного метода или свойства не имеет смысла, потому что private запрещает доступ к нему кому-либо еще, а abstract запрещает самому доступ к нему. Так что, по сути, не было бы возможности назвать это.

РЕДАКТИРОВАТЬ: см. Ответ Джона Скита о частных конструкторах. Однако частные члены других видов не могут существовать в абстрактных классах.

1 голос
/ 14 октября 2010

Абстрактные классы имеют конструкторы. Когда вы создаете экземпляр производного класса, вызываются конструкторы его родительского класса. Это относится и к классам, производным от абстрактных классов.

...