C#の継承について混乱

私はこのような基本クラスを持っています:

public class BaseController : Controller {
}

これを継承するクラス:

public class ABC : BaseController {
   public void Create(string a, string b) {
      var Meta = new Meta();
      Meta.Title = "test";
   }
}

public class DEF : BaseController {
   public void Create(string a, string b, string c) {
      var Meta = new Meta();
      Meta.Title = "job";
   }
}

BaseControllerから継承するすべてのクラスは、Meta()のインスタンスを作成する必要があります。

Is there some way that I could move this creation from the classes ABC & DEF into the base controller? Note that some of the methods in classes ABC, DEF etc have different number of arguments.

私がこれを持っていた1つのアイデアは、BaseControllerで次のことをすることでした:

    public Meta Meta { get; set; }
    protected override void Initialize(RequestContext requestContext)
    {
        if (Meta == null) { Meta = new Meta(); }
    }

これは有効なことですか?また、BaseControllerでこれを行った場合、MetaフィールドはBaseControllerから継承したクラスで使用できますか?

1

2 答え

私はおそらく以下のようにそれを行うだろう。もちろん、保護されている(または公開されている)と定義すると、メタにアクセスできます。

public class BaseController : Controller { 
   protected Meta meta;

   public void Create() { 
      meta = new Meta(); 
   } 
}

public class ABC : BaseController { 
   public void Create(string a, string b) { 
      base.Create();
   } 
} 

public class DEF : BaseController { 
   public void Create(string a, string b, string c) { 
      base.Create();
   } 
} 
5
追加された
@EmirAkaydınあなたは var 宣言を削除する必要があります。今はローカル変数を代入しています
追加された 著者 Davy8,
私はちょうど元の名前を変更し、別のものに名前を変更し、タイトルの設定を追加しました。あなたは一見を持てますか?保護を追加することをお勧めしますが、どのように役立つでしょうか?
追加された 著者 Samantha J T Star,
Emirに感謝します。私はABCとDEFのクラスでそれに物事を追加する変数のメタへのアクセスを取得する必要があります。それもできますか?それはそれが保護されないことを必要とするでしょうか?
追加された 著者 Samantha J T Star,
私はそこにコードを変更せず、ちょうどそれが存在するように2つの場所からこのコード行をマージしました。それで私は保護された変数などを追加しなかったのです
追加された 著者 Emir Akaydın,
私は型と異なる変数として小文字のメタを使用しました。それはあなたが欲しいものですか?
追加された 著者 Emir Akaydın,
クラス内の他の変数と同様に、その変数にアクセスできます。保護された手段は、外部からの直接アクセスから保護されています。そのクラスを継承するクラスは保護されたメンバーにアクセスできます。
追加された 著者 Emir Akaydın,
@ Davy8:あなたは正しいです。それを削除しました。元のコードから変更してコードをコンパイルしようとしていないことによって引き起こされたミスアラート。 :)
追加された 著者 Emir Akaydın,
これは良い答えですが、var aはBaseControllerのCreateメソッドのaパラメータと競合します。
追加された 著者 Peter LaComb Jr.,

私はこのような何かをするだろう:

public class BaseController : Controller {
    protected Meta Meta { get; set; }
    protected void Create()
    {
        if (Meta == null) { Meta = new Meta(); }
    }
}

public class ABC : BaseController {
   public void Create(string a, string b) {
      base.Create();
   }
}

public class DEF : BaseController {
   public void Create(string a, string b, string c) {
      base.Create();
   }
}

基本クラスからMetaへのアクセスのみを望む場合は、meta private を作成します。ベースクラスから継承したものだけからMetaにアクセスしたい場合は、 protected にします。 ABCやDEFのインスタンスを作成してMetaにアクセスできるようにするには、 public にします。

3
追加された