【问题标题】:How to change interface to base class?如何将接口更改为基类?
【发布时间】:2013-10-04 06:19:36
【问题描述】:

假设我有两个接口, DeviceDeviceSettings, 然后我有课:

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

Device接口中,调用了两个函数:

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

示例: DevA.GetSettings()可以从DevASettings获取设置

现在我想将DeviceSettings 从接口更改为基类。 并且仍然想使用例如DevA.GetSettings()可以从DevASetting获取设置

那么我该如何更改 Device : 例如如何更改上述两个函数调用,以便Device 可以从其DeviceSettings 类中获取设置。

【问题讨论】:

  • 您列出了Device 函数,但没有提及DeviceSettings 接口有什么,但您询问将DeviceSettings 接口更改为类。我很困惑。你能澄清你的问题吗?
  • 使用接口的命名约定。例如IDevice 接口,而不仅仅是Device 它增加了可读性

标签: c# class interface


【解决方案1】:

你可以制作这样的设备界面

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();
    }
}

【讨论】:

    【解决方案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】:

      使 DeviceSettings 成为一个抽象类

      【讨论】:

        【解决方案4】:

        用属性改变了实现。我没有看到基类或用其派生类替换它的问题。根据你的需要改变它。

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-10
          • 2019-06-12
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-22
          • 2021-04-16
          • 2014-03-26
          相关资源
          最近更新 更多