メールをフォーマットするクラス BaseEmailTemplate があり、デフォルトを上書きできる派生型を作成したいと考えています。もともと私のベースコンストラクター -
public BaseEmailTemplate(Topic topic)
{
CreateAddresses(topic);
CreateSubject(topic);
CreateBody(topic);
}
... (Body/Addresses)
protected virtual void CreateSubject(Topic topic)
{
Subject = string.Format("Base boring format: {0}", topic.Name);
}
そして私の派生では
public NewEmailTemplate(Topic topic) : Base (topic)
{
//Do other things
}
protected override void CreateSubject(Topic topic)
{
Subject = string.Format("New Topic: {0} - {1})", topic.Id, topic.Name);
}
もちろん、これはここで説明されているエラーにつながります:コンストラクターでの仮想メンバー呼び出し
したがって、これについて率直に言うと、すべての派生型で同じメソッドを呼び出す必要はありません。反対に、一部/すべてを変更できる必要があります。別のベースには異なるアドレスのサブセットがあることは知っていますが、本文と件名がデフォルトになります。
3 つのメソッドすべてを呼び出す必要があり、それらのいずれかを変更する機能は、派生ごとに使用できる必要があります。
誰もが言っているように見えることは、仮想を使用することの意図しない結果であるように思われることを意味します。それは私の正確な意図のようです..
更新 - 明確化
コンストラクターの仮想メンバーが悪い理由を理解しています。そのトピックに関する回答に感謝しますが、私の質問は「なぜこれが悪いのですか?」ではありません。それは「わかりました、これは悪いことですが、何が自分のニーズに適しているのかわかりません。それで、どうすればよいですか?」
これが現在実装されている方法です
private void SendNewTopic(TopicDTO topicDto)
{
Topic topic = Mapper.Map<TopicDTO , Topic>(topicDto);
var newEmail = new NewEmailTemplate(topic);
SendEmail(newEmail); //Preexisting Template Reader infrastructure
//Logging.....
}
私は子供と孫を扱っています。私が入ったのは newemailtemplate だけでしたが、他に 4 つのテンプレートを作成する必要がありますが、コードの 90% は再利用可能です。そのため、BaseEmailTemplate(Topic topic) を作成することにしました。BaseTemplate は、Subject や List など、SendEmail が読み取ることを期待するものを作成します。
NewEmailTemplate(Topic topic): BaseEmailTemplate(Topic topic): BaseTemplate, IEmailTempate
私の仕事をフォローしている人にそのことを知ってもらう必要がないことを望みます
var newEmail = new NewEmailTemplate();
newEmail.Init(topic);
使用するたびに必要です。オブジェクトはそれなしでは使用できません。それについて多くの警告があると思いましたか?