Основная цель наследования - обеспечить общую функциональность и описать общность между классами. Я бы предположил, что ваше описание характеристик двух людей (безошибочных и ошибочных) отвлекает и вызывает путаницу.
Что общего у людей? У всех людей есть открытый метод do_task () и закрытый / защищенный метод do_something (). Итак, мы описываем, что это супер класс под названием "Человек"
public abstract class Human
{
// describes commonality
public abstract void do_task();
// provides common functionality
protected virtual void do_something()
{
throw new Exception("I made a mistake");
}
}
и теперь «унаследованные» классы реализуют свою собственную специфическую логику для метода do_task (), но у них есть общая функциональность защищенного метода do_something ()
public class InfallibleHuman : Human
{
public override void do_task()
{
try
{
do_something();
}
catch
{
// never throw an exception
// because I never make mistakes
}
}
}
public class FallibleHuman : Human
{
public override void do_task()
{
do_something();
// always throw an exception if
// something goes wrong because I'm accountable
// for my own actions
}
}
Теперь, мы использовали наследование, чтобы описать общность между людьми и предоставить стандартную реализацию по умолчанию, но в подклассовой версии добавлено специфическое поведение, которое мы использовали для описания слов «Ошибка» и «Безошибочный», которое ничего общего с наследством.
Теперь, если у вас есть что-то, что использует людей, и оно примет любого человека, вы можете использовать InfallibleHuman или FallibleHuman.
public void ImPrettyTolerantOfMistakes()
{
try
{
Human anyHumanWillDo = new FallibleHuman();
anyHumanWillDo.do_task();
Human anotherHuman = new InfallibleHuman();
anotherHuman.do_task();
}
catch
{
// I'll take care of a human
// making a mistake
}
}
Но если вы используете что-то нетерпимое к людям, которые допускают ошибки, вы бы использовали совершенного человека ...
public void ImIntolerantOfHumansWhoMakeMistakes()
{
InfallibleHuman onlyAPerfectHumanWillDo = new InfallibleHuman();
onlyAPerfectHumanWillDo.do_task();
// if this guy fails, I'm dead meat
}
Надеюсь, все немного прояснится для вас.