0

Я работаю над заданием, которое позволит пользователю покупать билеты на несколько разных типов событий. Я должен использовать класс для билетов, которые не могут быть созданы, с подклассом для каждого из конкретных типов билетов.абстрактное наследование в C#

Я бежал в мою первую корягу, которая является то, что параметры на базовый конструктор подкласса дает мне ошибку «Ссылка на объекте требуется для нестатического поля»

Вот базовый класс

abstract class Ticket 
{ 
    public int ticketcount; 
    public double ticketprice; 

    public Ticket() 
    { 
     ticketcount = 0; 
     ticketprice = 0; 
    } 

    public Ticket(int ticketcount, double ticketprice) 
    { 
     this.ticketcount = ticketcount; 
     this.ticketprice = ticketprice; 
    } 

} 

и вот подкласс.

class PlayTicket : Ticket 
{ 
    public PlayTicket() : base() 
    { 

    } 

    public PlayTicket(string sn) : base(ticketcount, ticketprice) 
    { 

    } 
} 

ошибка происходит на линии

public PlayTicket(string sn) : base(ticketcount, ticketprice) 

где переменные "ticketcount" и "ticketprice" есть. Как мне лучше всего обойти это? Или я полностью не понимаю, как и почему использовать не-instatiatable класс?

+0

Ну, где вы ожидаете, что он получит «ticketcount» и «ticketprice»? Вы создаете новый объект. Вероятно, у вас должны быть такие дополнительные параметры. (Кроме того, вы должны использовать 'ticketCount' и' ticketPrice' как имена и, вероятно, использовать 'decimal' вместо' double' в качестве типа цены.) –

+0

Что вы пытаетесь сделать с 'public PlayTicket (string sn): base (ticketcount, ticketprice) '? Вам необходимо предоставить значения для параметров базового конструктора, например 'public PlayTicket (string sn): base (1, 25)' –

+0

Не должно ли это работать, поскольку PlayTicket выходит из Ticket? Книга, которую мы используем, демонстрирует, что она работает именно так. – shrimppunk

ответ

1

При вызове родительского конструктора детского конструктора, вы должны передать значение аргумента из детского конструктора родительского конструктора.

Вы ребенка конструктор должен быть таким:

public PlayTicket(string sn, int ticketcount,double ticketprice) : base(ticketcount, ticketprice) 
{ 

} 

Таким образом, ticketcount и ticketprice переходит к родительскому конструктору и инициализации соответственно.

При создании нового объекта PlayTicket, вы должны сделать:

Ticket playTicket = new PlayTicket("mySN", 20, 200); 

Как JonSkeet предложены в комментариях, что вы должны использовать для десятичных денежной стоимости.

0

Конструктор для производного класса PlayTicket, вероятно, следует иметь ticketcount и ticketprice в качестве параметров, Fx:

public PlayTicket(string sn, int ticketcount, double ticketprice) : base(ticketcount, ticketprice) 
{ 
    //... 
}