Скажем, у меня есть три или более класса: Инженер: Сотрудник: Лицо. Рассмотрим следующий пример (вид, что я использовать StringBuilder и другие лучшие практики в настоящее время)Многоуровневое наследование Расширяемые методы
public abstract class Person
{
public string Name{get;set;}
public string SaySomething()
{
string introduction = "Hello, my name is " + Name + ". ";
return OnSaySomething(introduction);
}
protected virtual string OnSaySomething(string thoughts)
{ return thoughts; }
}
public abstract class Employee : Person
{
public string Employer{get;set;}
protected override string OnSaySomething(string thoughts)
{
return thoughts + "I work for " + Employer + ".";
}
}
public class Engineer : Employee
{
public string Discipline{get;set;}
protected override string OnSaySomething(string thoughts)
{
return thoughts + "My discipline is " + Discipline + ".";
}
}
В примере выше, выход:
Engineer engineer = new Engineer();
engineer.Name = "Dennis Ritchie";
engineer.Discipline = "Software Engineering";
Console.WriteLine(engineer.SaySomething());
даст
Здравствуйте, мой имя Деннис Ритчи. Моя дисциплина - Software Engineering.
Можно ли структурировать эти классы таким образом, что каждое переопределение «Гвозди» по большей функциональности, например, что выход:
Здравствуйте, меня зовут Денис Ритчи. Я работаю на . Моя дисциплина - Разработка программного обеспечения.
Есть ли стандартный способ реализации такой идеи? Мое решение для коленного сустава заключается в том, чтобы запечатать OnSaySomething()
по адресу Employee
и ввести новый метод OnEmployeeSaySomething()
, который Engineer
переопределит для своей конкретной логики.
Это, кажется, запутаться довольно быстро, хотя с тех пор SaySomething()
, OnSaySomething()
и OnEmployeeSaySomething()
все выставлены на Engineer
(и даже хуже, если есть другой уровень в иерархии!). Интересно, есть ли лучшее решение. Спасибо за внимание!
TL; DR: Я хочу расширить, не разрушая базовую логику. Но я не хочу, чтобы мои занятия были действительно грязными.
EDIT:
Кто-то показало хорошее (возможно очевидное) решение, которое моя вина для обеспечения плохого примера. Вместо этого, говорим, что мы проверка некоторых данных в этом виде сценария:
public class Level0
{
public string Data{get;set;}
public bool IsValid()
{
if (Data == null) return false;
else return OnIsValid();
}
protected virtual bool OnIsValid()
{return true;}
}
public class Level1 : Level0
{
public string Data_Level1{get;set;}
protected override OnIsValid()
{
if (Data_level1 == null) return false;
else return OnLevel1IsValid();
}
protected virtual bool OnLevel1IsValid()
{return true;}
}
public class Level2 : Level1
{
public string Data_Level2{get;set;}
protected override OnLevel1IsValid()
{
return Data_level2 != null;
}
}
В чем отличие второго примера? Это выглядит немного более запутанным для меня. – 31eee384
Это был долгий день - спасибо всем. – Softerware