C# Наследование, добавление новых методов

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

Я наследую класс как

Class A (int a, int b, int c)

public A(int a, int b, int c)
{
}

Class B : A 

public B(int a, int b, int c) base: (a, b, c)

public void blah(int something)
{

}

Почему я не могу сделать это, а затем сделать:

B classb = new B(1,2,3);

classb.blah(4);

Вместо этого я должен сделать

public virtual void blah(int something)
{
}  

В классе А, затем в классе В:

public override void blah(int something)
{
 //method to be used in B but not A.
}

Так что даже если я не собираюсь когда-либо использовать метод в классе A I, все равно придется объявлять виртуальный? Так что, если я наследую класс C: B, то что? Я должен объявить вещи в A для C?

4 ответа

Решение

Ваше предположение не имеет никакого значения, по крайней мере, насколько я понял.

Рассмотрим следующий пример:

public class Base {}

public class Derived : Base {
    public void DerivedSpecificMethod() {
    }
}

если вы делаете

Derived d = new Derived(); //as you specify in code example 
d.DerivedSpecificMethod(); //you CAN do this.

virtual может понадобиться в случае, если вы напишите:

Base b = new Derived(); //note, I use a Base here on left side of equation
b.DerivedSpecificVirtualMethod(); //virtual method call

Почему я не могу сделать это, а затем сделать:

B classb = new B(1,2,3);

classb.blah(4);

Вы абсолютно можете. С этим нет никаких проблем, кроме синтаксических ошибок в вашем коде. Вот полный пример, который компилируется и запускается без проблем. (Я одновременно исправил нарушение соглашения об именах для blah Метод.)

using System;

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A
{
    public B(int a, int b, int c) : base(a, b, c)
    {
    }

    public void Blah(int something)
    {
        Console.WriteLine("B.Blah");
    }
}



class Test
{
    static void Main()
    {
        B b = new B(1, 2, 3);
        b.Blah(10);
    }
}

В этом нет ничего плохого, кроме того, что ваш код на самом деле не является допустимым C#. Я думаю, что это то, что вы хотите:

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A 
{
    public B(int a, int b, int c) : base(a, b, c)
    {
    }

    public void blah(int something)
    {
    }
}

Тогда это не проблема:

B classb = new B(1,2,3);
classb.blah(4);

Ваш код не скомпилируется. Вам не нужно использовать virtual спецификатор, это работает как ожидалось:

class App
{
    static void Main()
    {
        B classb = new B(1,2,3);
        classb.blah(4);
    }
}

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A 
{
    public B(int a, int b, int c): base (a, b, c)
    {
    }

    public void blah(int something)
    {
        Console.WriteLine(something);
    }
}
Другие вопросы по тегам