2016-06-20 2 views
-1

Я занимаюсь факторингом своего кода. У меня есть класс Car как базовый класс. Расширение класса автомобилей - внедорожник и седан. Потенциально, мне придется добавить гораздо больше автомобилей. Все они будут иметь один и тот же метод Run. Интересно, можно ли удалить метод Run из всех производных классов и сохранить метод Run в классе Car, который ссылается на зажигание, созданное в производных классах. Ниже приведен упрощенный код. Кроме того, зажигание должно создаваться только один раз.Доступ к подклассу и атрибут из базового класса

public abstract class Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = A;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 

public class Sedan : Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = B;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 

public class SUV : Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = C;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 
+1

Почему 'Ignition' и' 'Start' static'? –

+2

Вы не используете 'using', поскольку он был разработан. 'using' по существу компилируется в' try {new ignition(); } наконец {ignition.Dispose(); } 'и' Ignition' (базовый тип) должны реализовать интерфейс 'IDisposable'. В результате трудно сказать, что вы пытаетесь сделать здесь. –

+0

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

ответ

0

Вам не нужно реализовать Run() в каждом производном классе, и на самом деле я бы сказал, вы не хотите, чтобы для этого примера. Каждый из полученных может предоставить свои собственные Ignition, отлично, но просто у вас есть Run() только на вашем базовом классе.

Кроме того, есть ли какая-либо причина Ignition является статической, а не заданной базой Car класс во время строительства? Вероятно, это позволит вам удалить ваш метод Start().

2

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

Да, но только если вы избавиться методов и свойств static. Если вы сделаете их экземпляр методы и свойства, то они будут наследоваться, и вы можете сделать Start виртуальный:

public abstract class Car 
{ 
    protected Ignition ignition {get; set;} 
    virtual void Start(){ ignition = A;} 
    public void Run(){ 
      Start(); 
    } 
} 

public class Sedan : Car 
{ 
    override void Start(){ ignition = B;} 
} 

public class SUV : Car 
{ 
    override void Start(){ ignition = C;} 
} 
Смежные вопросы