Estou começando em C# E criei uma classe Programador que herda de Funcionário que herda de pessoa. Fiz uma validação dos campos e pra isso criei uma nova classe LancaExcecaoArguemnto, mas não se se isso foi legal. Estou em dúvida se esse código está correto ou não.
Segue código completo.
using System;
namespace AplicativoTexte.Pessoas
{
    public abstract class Pessoa
    {
        protected LancaExcecaoArgumento lancaExcecao = new LancaExcecaoArgumento();
        public string Nome { get; set; }
        public string CPF { get; private set; }
        public string Cidade { get; private set; }
        private static int _totalPessoas;
        //----------------------------------------------------------------------
        // Construtor.
        public Pessoa(string cpf, string cidade)
        {
            Console.WriteLine("Criando PESSOA.");
            if (string.IsNullOrEmpty(cpf))
            {
                lancaExcecao.LancaExcecao(nameof(cpf));
            }
            CPF = cpf;
            if (string.IsNullOrEmpty(cpf))
            {
                lancaExcecao.LancaExcecao(nameof(cidade));
            }
            Cidade = cidade;
            _totalPessoas++;
        }
        //----------------------------------------------------------------------
        // Total de pessoas.
        public int GetTotalPessoas()
        {
            return _totalPessoas;
        }
    }
}
using System;
namespace AplicativoTexte.Pessoas
{
    public abstract class Funcionario : Pessoa
    {
        public int Lotacao { get; protected set; }
        public double Salario { get; protected set; }
        //----------------------------------------------------------------------
        // Construtor
        public Funcionario(string cpf, string cidade, int lotacao, double salario) : base(cpf, cidade)
        {
            Console.WriteLine("Criando FUNCIONÁRIO.");
            if (lotacao <= 0)
            {
                lancaExcecao.LancaExcecao(nameof(lotacao));
            }
            Lotacao = lotacao;
            if (salario  <= 0)
            {
                lancaExcecao.LancaExcecao(nameof(cidade));
            }
            Salario = salario;
        }
    }
}
using System;
namespace AplicativoTexte.Pessoas
{
    public class Programador : Funcionario
    {
        public string cargo { get; set; }
        //----------------------------------------------------------------------
        // Construtor
        public Programador(string cpf, string cidade, int lotacao, double salario) : base(cpf, cidade, lotacao, salario)
        {
            Console.WriteLine("Criando PROGRAMADOR.");
        }
    }
}
using System;
namespace AplicativoTexte
{
    public class LancaExcecaoArgumento
    {
        public string nomeArgumento { get; set; }
        public void LancaExcecao(string nomeArgumento)
        {
            throw new ArgumentNullException($"O campo { nomeArgumento } não pode ser vazio.", nomeArgumento);
        }
    }
}
using AplicativoTexte.Pessoas;
using System;
namespace AplicativoTexte
{
    class Program
    {
        static void Main(string[] args)
        {
            Programador programador = new Programador("555.529.949-49", "Umuarama", 123, 100);
            programador.Nome = "Maria";
            Console.WriteLine(programador.Salario);
            Console.WriteLine(programador);
            Programador prog = new Programador("225.365.659-65", "Lovat", 800, 2000);
            prog.Nome = "Joana";
            Console.WriteLine(prog.Salario);
            Console.WriteLine("Total de Pessoas: " + prog.GetTotalPessoas());
            Console.ReadLine();
        }
    }
}
