Простое объяснение по аналогии
Президент Соединенных Штатов использует полиморфизм. Как? Ну, у него много советников:
- Военные советники
- Юрисконсульты
- Физики-ядерщики (в качестве советников)
- Медицинские консультанты
- и т. Д. И т. Д.
Каждый должен нести ответственность только за одну вещь: Пример:
Президент не является специалистом по цинкованию или квантовой физике. Он не знает многих вещей - но он знает только одно: как управлять страной.
То же самое с кодом: проблемы и обязанности должны быть разделены между соответствующими классами / людьми. В противном случае, если бы президент знал буквально все на свете - всю Википедию Представьте, что в вашем коде есть вся википедия: поддерживать ее было бы кошмаром.
Почему президенту плохо знать все эти специфические вещи?
Если бы президент специально говорил людям, что делать, это означало бы, что президент должен точно знать, что делать. Если президенту нужно знать конкретные вещи самому, это означает, что когда вам нужно внести изменения, вам нужно сделать это в двух местах, а не в одном.
Например, если EPA изменит законы о загрязнении, то когда это произойдет: вам нужно будет изменить класс EPA , а также класс Президента. Изменение кода в двух местах, а не в одном, может быть опасным, потому что его гораздо сложнее поддерживать.
Есть ли лучший подход?
Есть лучший подход: президенту не нужно знать специфику чего-либо - он может требовать лучшего совета от людей, которым конкретно поручено делать эти вещи.
Он может использовать полиморфный подход к управлению страной.
Пример - использования полиморфного подхода:
Все, что президент делает, это просит людей посоветовать ему - и это то, что он на самом деле делает в реальной жизни - и это то, что должен делать хороший президент. все его советники реагируют по-разному, но все они знают, что президент имеет в виду: Advise (). У него сотни людей, стекающихся в его офис. На самом деле не имеет значения, кто они. Все, что президент знает, это то, что, когда он просит их «посоветовать», они знают, как реагировать соответственно :
public class MisterPresident
{
public void RunTheCountry()
{
// assume the Petraeus and Condi classes etc are instantiated.
petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
condolezza.Advise(); // # she says negotiate trade deal with Iran
healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
}
}
Такой подход позволяет президенту управлять страной буквально, не зная ничего о военной технике, здравоохранении или международной дипломатии: детали оставлены на усмотрение экспертов. Единственное, что нужно знать президенту, это: «Advise ()».
Что вы не хотите: T
public class MisterPresident
{
public void RunTheCountry()
{
// people walk into the Presidents office and he tells them what to do
// depending on who they are.
// Fallujah Advice - Mr Prez tells his military exactly what to do.
petraeus.IncreaseTroopNumbers();
petraeus.ImproveSecurity();
petraeus.PayContractors();
// Condi diplomacy advice - Prez tells Condi how to negotiate
condi.StallNegotiations();
condi.LowBallFigure();
condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();
// Health care
healthOfficial.IncreasePremiums();
healthOfficial.AddPreexistingConditions();
}
}
НЕТ! НЕТ! НЕТ! В вышеупомянутом сценарии президент делает всю работу: он знает об увеличении численности войск и уже существующих условиях. Это означает, что если ближневосточная политика изменится, то президенту придется изменить свои команды, , а также класс Петреуса. Нам нужно только изменить класс Петреуса, потому что президенту не нужно увязать в таких деталях. Ему не нужно знать о деталях. Все, что ему нужно знать, это то, что если он сделает один заказ, обо всем позаботятся. Все детали должны быть оставлены на усмотрение экспертов.
Это позволяет президенту делать то, что у него получается лучше всего: устанавливать общую политику, хорошо выглядеть и играть в гольф: P.
Как это на самом деле реализовано - через базовый класс или общий интерфейс
В сущности, это полиморфизм, в двух словах. Как именно это сделано? Посредством «реализации общего интерфейса» или с использованием базового класса (наследование) - см. Ответы выше, которые более подробно описывают это. (Чтобы более четко понять эту концепцию, вам нужно знать, что такое интерфейс, и вам нужно понять, что такое наследование. Без этого вы можете бороться.)
Другими словами, Petraeus, Condi и HealthOfficials будут классами, которые "реализуют интерфейс" - назовем его интерфейсом IAdvisor
, который содержит только один метод: Advise()
. Но теперь мы углубляемся в специфику.
Это было бы идеально
public class MisterPresident
{
// You can pass in any advisor: Condi, HealthOfficials,
// Petraeus etc. The president has no idea who it will
// be. But he does know that he can ask them to "advise"
// and that's all Mr Prez cares for.
public void RunTheCountry(IAdvisor governmentOfficer)
{
governmentOfficer.Advise();
}
}
public class USA
{
MisterPresident president;
public USA(MisterPresident president)
{
this.president = president;
}
public void ImplementPolicy()
{
IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
president.RunTheCountry(governmentOfficer);
}
}
Краткое описание
Все, что вам действительно нужно знать, это:
- Президенту не нужно знать специфику - это оставлено другим.
- Все, что нужно знать президенту, это спрашивать, кто входит в дверь, чтобы дать ему совет - и мы знаем, что они будут абсолютно уверены, что делать, когда их попросят дать совет (потому что все они на самом деле, советники (или IAdvisors: ))
Я действительно надеюсь, что это поможет вам. Если вы ничего не понимаете, оставьте комментарий, и я попробую еще раз.