解耦
在编程和设计中,通常是尽可能少地依赖其他模块来创建可重用的代码。
工厂模式在这个上下文中
使用工厂模式时,您有一个集中的工厂可以创建对象,而不必自己定义它们。这将由对象的定义确定。
抽象和接口
接口
定义接口是最佳实践,因为它允许使用轻量级类型进行推断,并提供了一个蓝图,所有继承类都必须遵守。例如,IDisposable
必须实现 Dispose
方法。请注意,这与接口解耦,因为继承 IDisposable
的每个类都将定义其自己的 Dispose
方法函数。
抽象
抽象类类似于接口,因为它用于继承和推断,但它包含所有类都将继承的定义。比如每个汽车都会有一个引擎,所以汽车的一个好的抽象类可以包括一组预定义的引擎方法。
编辑
说明
这里您将看到一个使用接口和抽象类的简单继承示例。当接口被抽象类继承并自定义其方法时,解耦发生。这允许类继承抽象类并仍然具有与接口相同的类型。优势在于,继承抽象类的类可以在预期类型为原始接口时使用。
解耦
该优势允许使用符合预期接口的任何��现。因此,可以编写并传入许多不同的重载。这是一个例子。
示例
接口定义
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; }
public void BeginWork(IReady readiness)
{
if (readiness.ComputeReadiness())
{
Start = true;
Work();
}
}
private void Work()
{
foreach( var name in WidgetNames )
{
}
}
}
多态性
public class Main
{
public Main()
{
IReady example = new Foo();
UsesIReady workExample = new UsesIReady();
workExample.BeginWork(example);
IReady sample = new Bar();
UsesIReady workSample = new UsesIReady();
workSample.BeginWork(sample);
}
}