Давайте возьмем Ваш пример Собаки и класса CAT, и давайте проиллюстрируем использование C#:
И собака и кошка являются животными, а именно, млекопитающие четвероногого животного (животные waaay слишком общий). Давайте предположим, что у Вас есть Млекопитающее абстрактного класса для них обоих:
public abstract class Mammal
Этот базовый класс будет, вероятно, иметь методы по умолчанию, такие как:
, Все из которых являются поведением, которые имеют более или менее ту же реализацию между любой разновидностью. Для определения этого, Вы будете иметь:
public class Dog : Mammal
public class Cat : Mammal
Теперь позволяют нам предположить, что существуют другие млекопитающие, которых мы будем обычно видеть в зоопарке:
public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal
Это все еще будет допустимо, потому что в ядре функциональности Feed()
и Mate()
все еще будет то же.
Однако жирафы, носорог и гиппопотамы не являются точно животными, из которых можно сделать домашних животных. Это - то, где интерфейс будет полезен:
public interface IPettable
{
IList<Trick> Tricks{get; set;}
void Bathe();
void Train(Trick t);
}
реализация для вышеупомянутого контракта не будет тем же между кошкой и собакой; помещение их реализаций в абстрактном классе для наследования будет плохой идеей.
Ваша Собака и определения CAT должны теперь быть похожими:
public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable
Теоретически можно переопределить их от более высокого базового класса, но по существу интерфейс позволяет Вам прибавлять только вещи, в которых Вы нуждаетесь в класс без потребности в наследовании.
, Следовательно, потому что можно обычно только наследоваться одному абстрактному классу (на большинстве языков OO со статическим контролем типов, который является... исключениями, включают C++), но быть в состоянии реализовать несколько интерфейсов, это позволяет Вам создавать объекты в строго как требуется основание.
Это работало на меня, и это немного более компактно.
const reg = /[0-9]+/g;
array.sort((a, b) => {
let v0 = a.replace(reg, v => v.padStart(10, '0'));
let v1 = b.replace(reg, v => v.padStart(10, '0'));
return v0.localeCompare(v1);
});