2013-06-21 8 views
0

В моем приложении C# у меня есть базовый класс, который содержит функцию Myfunction. У меня есть производный класс из вышеупомянутого базового класса, который также содержит ту же функцию, что и в базовом классе, является ли эта концепция правильной реализацией?Метод Перегрузка или переопределение метода?

public class BaseClass 
{ 
    public void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 


public class DerivedClass:BaseClass 
{ 
    public void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 

Я Newbee в программировании, извините за мой английский

ответ

5

У вас есть hiddenBaseClass.MyFunction, делая это таким образом.

Если вы хотите переопределить правильно, вы должны объявить базовую версию, как virtual (или abstract), а затем указать override:

public class BaseClass 
{ 
    public virtual void MyFunction() { } 
} 

public class DerivedClass:BaseClass 
{ 
    public override void MyFunction() { } 
} 

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

public void MyFunction(int i) {} 
public void MyFunction(decimal d) {} 

Вы бы сказали, что есть два перегрузки из MyFunction.

+0

«Вы на самом деле скрыли BaseClass.MyFunction, делая это именно так». - Нет, не без ключевого слова 'new' ... код OP не будет компилироваться. –

+0

@JimBalter Скомпилируется с предупреждением, если вы не добавите 'new'. – Blorgbeard

+0

Моя ошибка. Он должен * быть ошибкой; что это не возможно для обратной совместимости. –

2

Нет, это неправильно реализация для method overloading.

Если вы создаете метод с же именем и же параметры, то это будет method overriding.

Если вы создаете метод с же именем, но различные параметры, то это будет method overloading.

Если вам нужно реализовать свой пример method overriding, затем добавьте override ключевое слово в вашем derived class method и добавьте virtual ключевое слово с вашим base class method:

public class BaseClass 
{ 
    public virtual void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 


public class DerivedClass:BaseClass 
{ 
    public override void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 

Если вы хотите реализовать пример overloading, то вы просто нужно будет изменить параметры ваших обоих методов. Изменение означает, что они должны отличаться друг от друга. например :

public class BaseClass 
    { 
     public void MyFunction() 
     { 
      Console.WriteLine(""); 
     } 
    } 


    public class DerivedClass:BaseClass 
    { 
     public void MyFunction(string input) 
     { 
      Console.WriteLine(""); 
     } 
    } 
+0

«переопределить класс» - нет, она идет по методу. Кроме того, ваше обсуждение перегрузки немного не работает; перегруженные методы обычно находятся в одном классе; наличие перегрузок в разных классах является запахом кода. –

+0

@JimBalter печатает ошибку .. и вы правы, они обычно находятся в одном классе. Но здесь я изменял его данный пример, поэтому он мог лучше понять – Shaharyar

+0

Чтобы лучше понять, измените последнее на «Консоль».WriteLine (input) '(на самом деле, я бы поставил его в базовый класс и имел' MyFunction() {MyFunction ("");} 'в производном классе). –

0

В этом примере MyFunction в DerivedClass переопределяет MyFunction в BaseClass.

Если у вас была еще одна функция MyFunction, на этот раз «MyFunction (int parameter)», вы бы перегрузили MyFunction.

+0

"В этом примере MyFunction в DerivedClass переопределяет MyFunction в BaseClass." - Нет, нет, это ошибка. C# требует либо ключевое слово 'new' в производном классе, либо' virtual' в базовом классе и 'override' в производном классе. –

+0

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

0

Вы должны перегрузить/overrieds методы таким образом

public class derived_Class : mybaseclass 
    { 

     public override void mymethod() 
     { 
      // IF you want to call the base class function as well then you call base.mymethod() ; 
      base.mymethod(); 
     } 


    } 

    class mybaseclass 
    { 

     // When you want to overide a method , you must use Virtual keyword 
     public virtual void mymethod() 
     { 

     } 

     // This is an overload of overload_method 
     // when you write many methods from same name with different arguments, it's an overload of the method 
     public void overload_method() 
     { 
     } 
     public void overload_method(string m) 
     { 

     } 

     // When you use an overload 
     public void use() 
     { 
      overload_method(); 
      overload_method(null); 
     } 
    }