2013-10-04 5 views
0

Скажем, у меня есть два интерфейса, Device и DeviceSettings, Тогда у меня есть классы:Как изменить интерфейс на базовый класс?

class DevA : Device 
class DevASettings : DeviceSettings 
class DevB : Device 
class DevBSettings : DeviceSettings 
class DevC : Device 
class DevCSettings : DeviceSettings 

In Device интерфейс, есть две функции называются:

DeviceSettings GetSettings(); 
void SetSettings(DeviceSettings setting); 

Пример: DevA.GetSettings() может получить настройки от DevASettings

N ow Я хочу изменить DeviceSettings от интерфейса к базовому классу. И все еще хотите использовать, например. DevA.GetSettings() могут получить настройки от DevASetting

Тогда как я могу внести изменения в Device: например как изменить выше двух вызовов функций, так что Device может получить настройки из своего класса DeviceSettings.

+3

Вы перечислены 'функции Device', но ничего не говорится о том, что' интерфейс DeviceSettings' имеет, но вы спросите об изменении 'интерфейса DeviceSettings' в класс. Я смущен. Можете ли вы прояснить свой вопрос, пожалуйста? – Shaamaan

+1

Используйте соглашение об именах для интерфейсов. Напр. Интерфейс «IDevice» вместо «Устройство» повышает читабельность – CarbineCoder

ответ

2

я на самом деле сделать Device в абстрактный класс:

public abstract class Device 
{ 
    DeviceSettings deviceSettings; 

    DeviceSettings GetSettings() 
    { 
     return this.deviceSettings; 
    } 

    void SetSettings(DeviceSettings setting) 
    { 
     this.deviceSettings = setting; 
    } 
} 

public class DevA : Device 
{ 
    public DevA() 
    { 
     this.deviceSettings = new DevASettings(); 
    } 

    //Do what you need with deviceSettings here 
} 

//Repeat for DevB/DevBSettings and DevC/DevCSettings 
3

Вы можете сделать интерфейс устройства, как этот

interface Device<T> where T:DeviceSettings 
{ 
T GetDevice(); 
void SerDevice(T settings); 
} 

class DeviceA:Device<DeviceASettings> 
{ 
    public DeviceASettings GetDevice() 
    { 
     throw new NotImplementedException(); 
    } 

    public void SerDevice(DeviceASettings settings) 
    { 
     throw new NotImplementedException(); 
    } 
} 
0

Altered реализацию со свойством , Я не вижу проблемы с базовым классом или заменяю его своим производным классом. Измените его в соответствии с вашими потребностями.

interface IDevice 
{ 
    DeviceSettingsBase DeviceSetting { get; set; } 
} 

class DeviceSettingsBase 
{ 
    public virtual void DeviceSettingsName() 
    { 
     Console.WriteLine("DeviceSettingsBase"); 
    } 
} 
class DevA : IDevice 
{ 
    public DeviceSettingsBase DeviceSetting { get; set; } 
} 

class DevASettings : DeviceSettingsBase 
{ 
    public override void DeviceSettingsName() 
    { 
     Console.WriteLine("DevASettings"); 
    } 
} 

class DevBSettings : DeviceSettingsBase 
{ 
    public override void DeviceSettingsName() 
    { 
     Console.WriteLine("DevBSettings"); 
    } 
} 

public static class Example 
{ 
    public static void Main() 
    { 
     DevA devA = new DevA(); 
     devA.DeviceSetting = new DevASettings(); 
     devA.DeviceSetting.DeviceSettingsName(); 
     devA.DeviceSetting = new DevBSettings(); 
     devA.DeviceSetting.DeviceSettingsName(); 
     devA.DeviceSetting = new DeviceSettingsBase(); 
     devA.DeviceSetting.DeviceSettingsName(); 
    } 
} 

ВЫВОД

DevASettings 
DevBSettings 
DeviceSettingsBase 
Смежные вопросы