概述
多态设计时候的一些小技巧,通过加入一层抽象类,减少后续的改动,如在抽象基类或者接口中加入新的method,此时并不需要在所有的实现类中去实现,只需要在需要实现的类中去实现处理,在抽象类中提供默认的实现,当然出现此种情况接口可能设计的时候存在一定的不合理,但是在实际的情况确实会出现不合理。
看下面的例子:
public interface IFile
{
bool Open();
}
public abstract class AbstractFile : IFile
{
public abstract bool Open();
}
public class ImageFile : AbstractFile
{
public override bool Open()
{
return DoOpenImageFile();
}
private bool DoOpenImageFile()
{
throw new NotImplementedException();
}
}
public class DocFile : AbstractFile
{
public override bool Open()
{
return DoOpenDocFile();
}
private bool DoOpenDocFile()
{
throw new NotImplementedException();
}
}
此时如果需要在IFile中加入新的method:bool TextFileBackup ();如果没有加入AbstractFile 层,则需要在所有的实现类中去实现该方法,而实际就DocFile 或者后面新加入的文本处理相关的File类需要实际处理该方法,ImageFile就直接返回。当然这里可以通过改进设计,将TextFileBackup方法从IFile中移走,但是实际情况有可能其他地方就是依赖IFile来调用TextFileBackup方法,这就造成改动会影响较大。
通过在AbstractFile中实现虚方法来加入一个默认的实现,在子类中就可以选择性的实现TextFileBackup了。
看下面的示例:
public abstract class AbstractFile : IFile
{
public abstract bool Open();
public virtual bool TextFileBackup()
{
return false;
}
}
只在DocFile中覆写
public class DocFile : AbstractFile
{
public override bool Open()
{
return DoOpenDocFile();
}
private bool DoOpenDocFile()
{
throw new NotImplementedException();
}
public override bool TextFileBackup()
{
return DoTextFileBackup();
}
private bool DoTextFileBackup()
{
throw new NotImplementedException();
}
}
总结
可能存在不合理,但是在设计时候加入抽象类层次,可以增加一定的灵活性。