Можно ли переопределить метод в базовом классе в пределах одного и того же класса (НЕ производного класса)? - PullRequest
6 голосов
/ 09 июня 2011

Насколько я понимаю, можно переопределить метод (помеченный как Virtual) в базовом классе из производного класса, используя ключевые слова override.

Но как насчет переопределенияметод в том же классе?

В моем конкретном случае у меня есть класс x с 2 методами.Метод a имеет некоторое общее поведение с b, а b добавляет функциональность к методу a.

В прошлом я дублировал код a в b и добавилновый функционал в b.

Я хотел бы знать, есть ли лучший подход, чтобы я мог централизовать поведение метода a.

    public class x
    {
       public static void a() {}
       public static void b() {}         
    }

Ответы [ 6 ]

11 голосов
/ 09 июня 2011

Вы можете просто вызвать свой метод a() из вашего метода b(). Нет необходимости (и нет способа) переопределить метод.

public class x
{
   private static int _i = 0;

   public static void a() {
       _i = 1;
   }
   public static void b() {
       a();
       // here is _i = 1;
   }         
}

С другой стороны, вы можете иметь перегрузки параметров для вашего метода.

public class x
{
   private static int _i = 0;

   public static void a() {
       a(1);
   }
   public static void a(int i) {
      _i = t;
      // common code which can use _i
   }         
}

В этом случае вы можете позвонить a(1) или a() с тем же результатом.

9 голосов
/ 09 июня 2011

Вы не можете переопределить в том же классе, вы делаете это только в производном классе.Вы можете поместить общее поведение вашего метода в метод a, а затем вызвать его из метода b.

public static void a() 
{
// some common functionality
}

public static void b()
{
// do something
a(); //call a
//do something else
}

Вы можете вызывать a изнутри b столько раз, сколько необходимо.

3 голосов
/ 09 июня 2011

Насколько я понимаю, можно переопределить метод (помеченный как виртуальный) в базовом классе из производного класса, используя переопределение ключевых слов.Но как насчет того же переопределения метода в том же классе?

Вы не можете сделать это.Виртуальные методы предназначены для Полиморфизм , который является причудливым способом сказать:

Если вы пишете метод, который принимает базовый класс, и передаете ему производный класс, и этот метод вызывает методв базовом классе он будет фактически вызывать производную реализацию.

class A
{
    public virtual void DoSomething() { Console.WriteLine("From A"); }
}

class B : A
{
    public override void DoSomething() { Console.WriteLine("From B"); }
}

class C
{
    public void DoSomethingMagic(A someClassInstance)
    {
        someClassInstance.DoSomething();
    }
}

class Program
{
    public static void Main(string[] args)
    {
        A a = new A();
        B b = new B();
        C c = new C();
        c.DoSomethingMagic(a); // Prints "From A"
        c.DoSomethingMagic(b); // Prints "From B", even though it takes an A

        A bIsAnA = new B();
        c.DoSomethingMagic(bIsAnA); // Prints "From B", because B is also an A
    }
}

При таком определении нет смысла пытаться "переопределить" метод в том же классе.

В моем конкретном случае у меня есть класс x с двумя методами, метод a как некоторое общее поведение с b, и b добавляет функциональность к методу a.

Просто вызовите a() от b():

public class x
{
   public static void a()
   {
       // "base" implementation here
   }

   public static void b()
   {
       a();
       // extra implementation here
   }
}
2 голосов
/ 09 июня 2011

Почему бы вам просто не позвонить a() из b()?

public static void b()
{
    // Do some stuff
    a(); // Do the common stuff
    // Do more stuff
}
1 голос
/ 09 июня 2011

Если я правильно понимаю, ваша проблема в том, что метод b имеет тот же код, что и метод a, плюс еще немного кода. Что-то вроде

public class x
{
    public void a()
    {
        // a code
    }

    public void b()
    {
        // a code

        // b code
    }
}

если это так, вы можете вызвать метод a в методе b следующим образом

class x
{
    public void a()
    {
        // a code
    }

    public void b()
    {
        a();

        // b code
    }
}

Другой случай, когда у вас есть общий код для обоих методов:

class x
{
    public void a()
    {
        // common code

        // a exclusive code
    }

    public void b()
    {
        // common code

        // b exclusive code
    }
}

Затем вы можете извлечь этот код в другой метод, подобный этому:

class x
{
    public void a()
    {
        CommonMethod();

        // a exclusive code
    }

    public void b()
    {
        CommonMethod();

        // b exclusive code
    }

    private void CommonMethod()
    {
        // common code
    }
}

И о переопределении метода в том же классе. Это называется перегрузка метода , но это работает, позволяя вам создать несколько методов с одинаковыми именами, которые отличаются друг от друга в зависимости от типа ввода.

Как это

class x
{
    public string a(int i)
    {
    }

    public string a(string s)
    {
    }
}

Единственное ограничение заключается в том, что методы должны иметь один и тот же тип возвращаемого значения (строка в этом примере).

1 голос
/ 09 июня 2011

Вы разделяете общую часть на третий общий, но закрытый метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...