-1

HomeController には Index というメソッドが 1 つあります。(Microsoft が提供する既定のテンプレートです)

 public class HomeController : Controller
    {

        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
   }

今私が欲しいのは...インデックスメソッドをオーバーライドすることです。以下のようなもの。

public partial class HomeController : Controller
    {

        public virtual ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        public override ActionResult Index()
        {
            ViewBag.Message = "Override Index";
            return View();
        }

    }

OO 設計の Open-Closed 原則のような既存のメソッドに変更を加えたくありません。それは可能ですか?または別の方法はありますか?

4

1 に答える 1

1

AControllerは通常の C# クラスであるため、通常の継承規則に従う必要があります。同じクラスのメソッドをオーバーライドしようとしている場合、それはナンセンスであり、コンパイルされません。

public class FooController
{
    public virtual ActionResult Bar()
    {
    }

    // COMPILER ERROR here, there's nothing to override
    public override ActionResult Bar()
    {
    }
}

のサブクラスがあるFoo場合、基本クラスのメソッドが とマークされていればオーバーライドできますvirtual。(そして、サブクラスがメソッドをオーバーライドしない場合、基本クラスのメソッドが呼び出されます。)

public class FooController
{
    public virtual ActionResult Bar()
    {
        return View();
    }
}

public class Foo1Controller : FooController
{
    public override ActionResult Bar()
    {
        return View();
    }
}

public class Foo2Controller : FooController
{
}

したがって、次のように機能します。

Foo1 foo1 = new Foo1();
foo1.Bar();               // here the overridden Bar method in Foo1 gets called
Foo2 foo2 = new Foo2();
foo2.Bar();               // here the base Bar method in Foo gets called
于 2012-09-27T05:47:36.593 に答える