Виртуальный C# (или краткий обзор) статические методы

Я думаю, вам нужно создать контроллер для управления ajax-данными. Я приведу пример:

Контроллер

public function displayprodt()
{
      $pid = $this->input->post('pid',true);

           $data=array(
                'error' =>false,
                'title' => 'Edit Product',
                'result' => $this->ProductModel->displayprodt($pid),
            );


      header('Content-Type: application/json');
      echo json_encode($data ,JSON_PRETTY_PRINT);
}

Модель [ 115]

public function displayprodt($pid){
        $this->db->select("*");
        $this->db->from("todaysdeal_products");
        $this->db->where("product_id",$pid);
        $query = $this->db->get();
        return $query->result();
    }

Jquery

$('.edit-pdt').click(function(){
        var base_url = $("#base_url").val();
        var pid = $(this).attr("data-pid");
        alert(pid);
        $.ajax({
           type: "POST",
           url: base_url+"index.php/Api/displayprodt",
           data: ({pid: pid}),
           dataType: "JSON",
           success: function(response) {
             location.href = base_url+"index.php/product/displayprodt"; // or any url you want redirect.
           }
        });
  });

Надеюсь, вы найдете решение: ')

12
задан Nick Whaley 18 April 2009 в 12:23
поделиться

3 ответа

Нет, вы не можете переопределить статический метод. «static» также означает, что он статически связан компилятором, поэтому вызываемый метод не найден во время выполнения, но связан во время компиляции.

Что нужно сделать, это сделать класс нестатичным. Сделайте метод виртуальным, переопределите его и получите полное преимущество от реального наследования. Затем, если вам это действительно нужно, создайте статическую точку входа для ссылки на ваш класс. Например, статическая фабрика, singleton (в большинстве случаев это анти-шаблон, но такой же хороший, как статический класс) или просто статическое свойство.

13
ответ дан 2 December 2019 в 05:55
поделиться

Если вы хотите использовать абстрактные статические методы, то это работает и оказывается для меня самым простым решением чтобы приспособиться к:

class TestBase<ChildType> where ChildType : TestBase<ChildType> {
    //public static abstract void TargetMethod();

    public static void Operation() {
        typeof(ChildType).GetMethod("TargetMethod").Invoke(null, null);
    }
}

class TestChild : TestBase<TestChild> {
    public static void TargetMethod() {
        Console.WriteLine("Child class");
    }
}

Но я все еще отмечаю Stafan как решение, потому что использование наследования экземпляров, вероятно, лучшая рекомендация для любого в подобной ситуации. Но мне просто пришлось бы переписать слишком много кода для этого.

2
ответ дан 2 December 2019 в 05:55
поделиться

Вы можете сохранить TargetMethod в качестве делегата, который подкласс может изменить при необходимости:

class TestBase {
    protected static Action _targetMethod;

    static new() {
       _targetMethod = new Action(() => {
           Console.WriteLine("Base class");
       });
    }

    public static void TargetMethod() {
        _targetMethod();
    }

    public static void Operation() {
        TargetMethod();
    }
}

class TestChild : TestBase {
    static new() {
       _targetMethod = new Action(() => {
           Console.WriteLine("Child class");
       });
    }
}

Так как они статические Тем не менее, экземпляры - _targetMethod совместно используются всеми экземплярами - изменение его в TestChild также изменяет его для TestBase . Вы можете или не можете заботиться об этом. Если вы это сделаете, вам могут помочь дженерики или словарь .

В целом, вам было бы намного легче, если бы вы не настаивали на статике или, возможно, использовали композицию вместо наследства.

9
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: