Идея проста - если ваш класс (YourClass) уже является производным от родительского класса (SomeParentClass), и в то же время вы хотите, чтобы ваш класс (YourClass) имел новое поведение, определенное в каком-то абстрактном классе (SomeAbstractClass) ), вы не можете сделать это, просто производные от этого абстрактного класса (SomeAbstractClass), C # не допускает множественного наследования.
Однако, если ваше новое поведение было определено в интерфейсе (IYourInterface), вы можете легко получить его из интерфейса (IYourInterface) вместе с родительским классом (SomeParentClass).
Рассмотрим класс Фрукты , полученный двумя детьми ( Яблоко & Банан ), как показано ниже:
class Fruit
{
public virtual string GetColor()
{
return string.Empty;
}
}
class Apple : Fruit
{
public override string GetColor()
{
return "Red";
}
}
class Banana : Fruit
{
public override string GetColor()
{
return "Yellow";
}
}
У нас есть существующий интерфейс ICloneable в C # . Этот интерфейс имеет единственный метод, как показано ниже, класс, который реализует этот интерфейс, гарантирует его клонирование:
public interface ICloneable
{
object Clone();
}
Теперь, если я хочу сделать мой Apple класс (не Banana класс) клонируемым, я могу просто реализовать ICloneable следующим образом:
class Apple : Fruit , ICloneable
{
public object Clone()
{
// add your code here
}
public override string GetColor()
{
return "Red";
}
}
Теперь рассмотрим ваш аргумент чисто абстрактного класса, если C # имел бы чистый абстрактный класс, скажем Clonable вместо интерфейса IClonable , например:
abstract class Clonable
{
public abstract object Clone();
}
Не могли бы вы теперь сделать свой класс Apple клонируемым путем наследования абстрактного Клонируемый вместо IClonable ? как это:
// Error: Class 'Apple' cannot have multiple base classes: 'Fruit' & 'Clonable'
class Apple : Fruit, Clonable
{
public object Clone()
{
// add your code here
}
public override string GetColor()
{
return "Red";
}
}
Нет, вы не можете, потому что класс не может быть производным от нескольких классов.