是的,这似乎是正确的方法。不,依靠接口对应用程序和设备库来说不是一件坏事,尤其是在您控制实现的情况下。
如果您出于某种原因担心设备可能不总是实现接口,则可以利用适配器模式并使设备的具体实现适应接口。
编辑
解决您的第五个问题时,请考虑以下结构(我假设您可以控制设备的定义):
您有一个核心库。其中有一个称为IDevice的接口。
在设备库中,您有对核心库的引用,并且定义了一系列均实现IDevice的设备。您还拥有一个工厂,该工厂知道如何创建不同类型的IDevice。
在您的应用程序中,您包括对核心库和设备库的引用。您的应用程序现在使用工厂来创建符合IDevice接口的对象的实例。
这是解决您的问题的多种可能方法之一。
例子:
namespace Core
{
public interface IDevice { }
}
namespace Devices
{
using Core;
class DeviceOne : IDevice { }
class DeviceTwo : IDevice { }
public class Factory
{
public IDevice CreateDeviceOne()
{
return new DeviceOne();
}
public IDevice CreateDeviceTwo()
{
return new DeviceTwo();
}
}
}
// do not implement IDevice
namespace ThirdrdPartyDevices
{
public class ThirdPartyDeviceOne { }
public class ThirdPartyDeviceTwo { }
}
namespace DeviceAdapters
{
using Core;
using ThirdPartyDevices;
class ThirdPartyDeviceAdapterOne : IDevice
{
private ThirdPartyDeviceOne _deviceOne;
// use the third party device to adapt to the interface
}
class ThirdPartyDeviceAdapterTwo : IDevice
{
private ThirdPartyDeviceTwo _deviceTwo;
// use the third party device to adapt to the interface
}
public class AdapterFactory
{
public IDevice CreateThirdPartyDeviceAdapterOne()
{
return new ThirdPartyDeviceAdapterOne();
}
public IDevice CreateThirdPartyDeviceAdapterTwo()
{
return new ThirdPartyDeviceAdapterTwo();
}
}
}
namespace Application
{
using Core;
using Devices;
using DeviceAdapters;
class App
{
void RunInHouse()
{
var factory = new Factory();
var devices = new List<IDevice>() { factory.CreateDeviceOne(), factory.CreateDeviceTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
void RunThirdParty()
{
var factory = new AdapterFactory();
var devices = new List<IDevice>() { factory.CreateThirdPartyDeviceAdapterOne(), factory.CreateThirdPartyDeviceAdapterTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
}
}