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);
}
}