2015-03-14 12 views
-2

OK. Мне удалось сжать все до 2 вопросов:C# OOP Задачи задачи

1/Является ли общедоступным enum должно быть в классе или вне его? Я думаю, они оба работали, но есть ли хорошая практика?

2/Я не понимаю, как создать конструктор, который имеет объект из другого класса. См. Комментарий в нижней части «Основной» класс.

GSM КЛАСС:

using System.Text; 

class GSM 
{ 
    public string model; 
    public string manufacturer; 
    public decimal price; 
    public string owner; 

    Battery battery = new Battery("Nokia", 7, 5); 
    Display display = new Display(12.5, 3); 

    // CONSTRUCTORS: 
    public GSM(string model, string manufacturer, decimal price, string owner) 
    { 
     this.model = model; 
     this.manufacturer = manufacturer; 
     this.price = price; 
     this.owner = owner; 
    } 
    public GSM(string model, string manufacturer, decimal price, string owner, Battery battery, Display display) 
     : this(model, manufacturer, price, owner) 
    { 
     this.battery = battery; 
     this.display = display; 
    } 

     } 

БАТАРЕИ

public enum BatteryType    // Is this suppose to be here or inside the class? 
{ 
    LiIon, LiPo, NiMH, NiCd 
} 

class Battery 
{ 
    //battery characteristics 
    private string model; 
    private int hoursIdle; 
    private int hoursTalk; 
    private BatteryType batteryType = new BatteryType(); 

} 

====== DISPLAY

class Display 
{ 
    //display characteristics 
    private double size; 
    private int numberOfColors; 

    // CONSTRUCTORS: 
    public Display(double size, int numberOfColors) 
    { 
     this.size = size; 
     this.numberOfColors = numberOfColors; 
    } 
} 

==== MAIN:

class GSMTest 
    { 
    public static void Main() 
    { 
     GSM myGSM = new GSM("Sony ERcs", "Sony ERRR", 124.56m, "Pesho", BatteryType.LiPo, 12.3); 
     // I can't create this object. Argument5: cannont convert from GSM.BatteryType to GSM.Battery. What gives!? 
     // Display has 2 fields. I have an instance of it in GSM. Yet I don't know how to set it here so I can create myGSM 

    } 

}

P.S. Все они из одного и того же пространства имен; И есть конструктор для класса Battery. Забыл включить его, не знаю, если это необходимо.

+1

Мы не собираемся анализировать весь код. Создайте небольшой образец, который воспроизводит проблему, с которой вы сталкиваетесь, и опишите проблему в одном вопросе для каждой проблемы, поделившись своими исследованиями по этой конкретной проблеме. – CodeCaster

+0

Спасибо! Я позаботился об этом. – Bruno

+0

Ваш GSM-конструктор ожидает экземпляр класса Battery, а не перечисление типа BatteryType. Вы должны создать экземпляр батареи и передать ссылку на этот экземпляр в вызове конструктора. То же самое происходит и с параметром Display.Вам нужен экземпляр Диска, чтобы передать туда не плавающее число – Steve

ответ

0

касаемо встраивание enum внутри class, лучше думать о enum как особый вид class (который, под капотом, то есть). Таким образом, только встраивайте enum в аналогичные ситуации, когда вы создадите nested class.

Проблемы, возникающие при синтаксисе при выполнении этой операции, - это простая многословность - ничто не может ссылаться на встроенный тип вне внешнего типа, не ссылаясь на внешний тип явно. Поскольку using может быть применен только к пространствам имен (кроме псевдонимов), он не будет сокращать синтаксис без дополнительной работы, поэтому рассмотреть вопрос о том, чтобы производитель больше смысла для внешнего вызывающего абонента сослаться на BatteryType в коде, как

var t = Battery.BatteryType.LiIon 

или

var t = BatteryType.NiCd 

Что касается, относящихся к типу внутри конструктора, когда конструктор принимает объект определенного типа, вы должны передать объект этого типа или производные от него. Таким образом, это может быть полезно для создания других переменных

Battery bat = new Battery(); 
Display disp = new Display(12.3, 256); 
GSM myGSM = new GSM("Sony ERcs", "Sony ERRR", 124.56m, "Pesho", bat, disp); 

Кроме того, вы можете вкладывать вызовы new так же, как с любым другим вызовом

GSM myGSM = new GSM(
    "Sony ERcs", 
    "Sony ERRR", 
    124.56m, 
    "Pesho", 
    new Battery(), 
    new Display(12.3, 256)); 
+0

Спасибо за подробное объяснение. :) Я думаю, что понял идею enum. В принципе, если он находится внутри класса, и мне он нужен в другом месте, мне нужно будет ссылаться на него . . <Элемент данных или переменная>. И нет никакого правильного или неправильного. Просто вопрос предпочтения. – Bruno

Смежные вопросы