static voic Main()
{
Console.WriteLine("Plesas select printer:");
string printerName = Console.Readline();
IPrint printer = null; if(printerName == "HP")
{
printer = new HPPrinter();
}
else if(printerName == "IBM")
{
printer = new IBMPrinter();
}
printer.PrintPreview();
printer.Print();
}
--------------
public class HPPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is HP Printer");
}
public void Print()
{
Console.WriteLine("this is HP Printer");
}
}public class IBMPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is IBM Printer");
}
public void Print()
{
Console.WriteLine("this is IBM Printer");
}
}
好上面代码不错了,但有一天突然需要加一个方法 size() 设置打印大小,正常想法是给接口增加一个方法,子类也去实现它。但如是子类数量很多时,这将是一个苦逼的工作。我想问一下如何处理这种情况,让增加新方法更容易,不用涉及其它子类。
{
Console.WriteLine("Plesas select printer:");
string printerName = Console.Readline();
IPrint printer = null; if(printerName == "HP")
{
printer = new HPPrinter();
}
else if(printerName == "IBM")
{
printer = new IBMPrinter();
}
printer.PrintPreview();
printer.Print();
}
--------------
public class HPPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is HP Printer");
}
public void Print()
{
Console.WriteLine("this is HP Printer");
}
}public class IBMPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is IBM Printer");
}
public void Print()
{
Console.WriteLine("this is IBM Printer");
}
}
好上面代码不错了,但有一天突然需要加一个方法 size() 设置打印大小,正常想法是给接口增加一个方法,子类也去实现它。但如是子类数量很多时,这将是一个苦逼的工作。我想问一下如何处理这种情况,让增加新方法更容易,不用涉及其它子类。
{
string Name { get; set; }
string MarkedValue { get; } event Action NameChanged;
}如果你需要扩展(并且确定一段时间内只需要扩展)一个属性那么可以这样写public interface IxxxV2: Ixxx
{
DateTime TheTime{get;set;}
}
注意,什么叫做扩展、什么叫做重新定义,我们肯定应该从设计上去找根源,要先“拔高一点”站在逻辑设计人员的高度,不要“俗气地”仅仅站在程序员的那种图省事的角度。
你对重构有着根本性的误解。如果你打开《重构--......》的书来看,你会看到很大的篇幅、很重的笔墨,甚至即使是其它篇章的每一部分的最后段都写着:需要测试驱动。也就是说,重构是在维系以前的测试基本上全都通过的情况下,才重构。不是胡乱修改之前设计的接口。所以修改,那个叫做制造代码“臭味”,而不是重构。
比如当你在原有的接口中增加一个新的方法时,抽象类增加实现此接口的抽象方法。这样你只需要在需要实现此接口的子类中override它,其他的子类也会受到影响。
http://www.cnblogs.com/x-xk/archive/2012/12/21/2823401.html这里面引用了head first设计模式的第一个例子,很好的说明了这个问题。
所有子类继承接口的同时也继承这个主类
格式如下
HPPrint : MainPrint, IPrint
这样在MainPrint下定义的方法及属性都可在子类使用,并且不影响到接口结构。
当然你也可以部分子类继承MainPrint,部分不继承
public abstract class PrintBase:IPrint
public class HPPrint : PrintBase
public class IBMPrint : PrintBase