Aqui está o porquê
class DOSClient {
OrderParser orderParser;
string orderCode;
DOSClient(OrderParser orderParser, string ordercode) {
this.orderParser = orderParser;
this.ordercode = ordercode;
}
void DisplayOrderCode() {
Console.Write( "Prefix: " + orderParser.GetStringPart(ordercode) );
...
}
}
class GUIClient {
OrderParser orderParser;
string orderCode;
GUI gui;
GUIClient(OrderParser orderParser, string ordercode, GUI gui) {
this.orderParser = orderParser;
this.ordercode = ordercode;
this.gui = gui;
}
void DisplayOrderCode() {
gui.Prefix( orderParser.GetStringPart(ordercode) );
...
}
}
class OrderParserUS : IOrderParser {
public string GetStringPart(string input)
{
//Some input validation which is removed for clarity
if(input.Length > 5)
return input.Substring(0,1);
if(input.Substring(0,1) == "B")
return input.Substring(0,3);
return string.empty;
}
}
class OrderParserEU : IOrderParser {
public string GetStringPart(string input)
{
//Some input validation which is removed for clarity
if(input.Length > 6)
return input.Substring(0,1);
if(input.Substring(0,1) == "#")
return input.Substring(0,3);
return string.empty;
}
}
Se você tivesse adotado um método estático, não haveria maneira de alterar o comportamento GetStringPart
sem destruir o antigo comportamento ou poluí-lo com lógica condicional. É verdade que as estáticas são máscaras globais disfarçadas, mas o fato de desabilitarem o polimorfismo é minha principal reclamação sobre elas. Métodos estáticos não são de primeira classe em idiomas OOP. Ao dar ao método um objeto para morar, mesmo um sem estado, tornamos o método portátil. Seu comportamento pode ser transmitido como o valor de uma variável.
Aqui eu imaginei um sistema que precisa se comportar de maneira um pouco diferente quando implantado na Europa e depois nos EUA. Em vez de forçar um sistema a conter o código necessário apenas pelo outro, podemos alterar o comportamento controlando qual objeto de análise de ordem é injetado nos clientes. Isso nos permite conter a propagação dos detalhes da região. Também facilita a adição do OrderParserCanada sem a necessidade de tocar nos analisadores existentes.
Se isso não significa nada para você, então realmente não há um bom argumento para isso.
BTW, GetStringPart
é um nome terrível.