解耦
在编程和设计中,这通常是使代码在尽可能少的依赖下可重用的行为。
在这种情况下的工厂模式
使用工厂模式时,您有一个集中式工厂,它可以创建对象而不必自己定义它们。这取决于对象的定义。
抽象和接口
界面
定义接口是最佳实践,因为它允许使用轻量级类型进行推理,并且还提供了所有继承类都必须遵守的蓝图。例如,IDisposable
必须实现Dispose
方法。请注意,这与接口是分离的,因为每个继承的类IDisposable
都将定义自己的Dispose
方法功能。
抽象的
Abstract 类似于接口,因为它用于继承和推理,但它包含所有类都将继承的定义。每辆汽车都会有一个引擎,所以一个好的汽车抽象类可以包含一组预定义的引擎方法。
编辑
解释
在这里,您将看到一个使用接口和抽象类的简单继承示例。当接口被抽象类继承,然后它的方法被定制时,就会发生解耦。这允许类继承抽象类并且仍然具有与接口相同的类型。优点是当期望的类型是原始接口时,可以使用继承抽象类的类。
解耦
该优势允许使用符合预期接口的任何实现。因此,可以编写和传入许多不同的重载。这是一个示例。
例子
接口定义
public interface IReady
{
bool ComputeReadiness();
}
遗产
public abstract class WidgetExample : IReady
{
public int WidgetCount { get; set; }
public int WidgetTarget { get; set; }
public bool WidgetsReady { get; set; }
public WidgetExample()
{
WidgetCount = 3;
WidgetTarget = 45;
}
public bool ComputeReadiness()
{
if (WidgetCount < WidgetTarget)
{
WidgetsReady = false;
}
return WidgetsReady;
}
}
public class Foo : WidgetExample
{
public Foo()
{
this.WidgetTarget = 2;
}
}
public class Bar : IReady
{
public bool ComputeReadiness()
{
return true;
}
}
解耦
public class UsesIReady
{
public bool Start { get; set; }
public List<string> WidgetNames { get; set; }
//Here is the decoupling. Note that any object passed
//in with type IReady will be accepted in this method
public void BeginWork(IReady readiness)
{
if (readiness.ComputeReadiness())
{
Start = true;
Work();
}
}
private void Work()
{
foreach( var name in WidgetNames )
{
//todo: build name
}
}
}
多态性
public class Main
{
public Main()
{
//Notice that either one of these implementations
//is accepted by BeginWork
//Foo uses the abstract class
IReady example = new Foo();
UsesIReady workExample = new UsesIReady();
workExample.BeginWork(example);
//Bar uses the interface
IReady sample = new Bar();
UsesIReady workSample = new UsesIReady();
workSample.BeginWork(sample);
}
}