2009-12-29 3 views
3

мне интересно, есть ли функция как метода наследование, а не наследование всего класса, позвольте мне уточнить, что я пытаюсь объяснить:Есть ли способ наследования в C#

class a { 
    public void GetA(){ 
    // some logic here 
} 
} 

class b { 
    public void GetB() : new Class().GetA() 
} 

Я знаю, это выглядит странно но я читал, как делать делегирование в шаблоне композиций объектов, и по какой-то причине я думал об этом шаблоне.

+0

На самом деле я не спрашиваю, существует ли такой же способ, может быть, есть еще один способ сделать это на C#, который обеспечивает лучшее и эффективное решение. Но все наследование класса не то, что я ищу. – Tarik

+0

Есть ли языки, которые это реализуют? – GrayWizardx

+0

@GrayWizardx уверен, что этот тип вещей возможен на многих языках, которые имеют функции в качестве объектов первого класса. Я знаю, что Python и JavaScript позволяют делать такие вещи. –

ответ

4

Если вы просто хотите вызвать GetA() внутри GetB(), но не хотите определять или явно ссылаться на экземпляр класса a в GetB(), вы можете передать GetA() в качестве делегата.

В C# существует множество предопределенных делегатов, таких как Action и Func. Или вы всегда можете перевернуть свой собственный делегат в соответствии с сигнатурой метода.

class a 
    { 
     public void GetA() 
     { 
      Console.WriteLine("Hello World!"); 
     } 
    } 

    class b 
    { 
     // No explicit reference to class a of any kind. 
     public void GetB(Action action) 
     { 
      action(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var a = new a(); 
      var b = new b(); 

      b.GetB(a.GetA); 
     } 
    } 
+0

Ничего себе, это выглядит круто, я не знал такого универсального решения .net уже предоставляет, я всегда создавал своих собственных делегатов ... – Tarik

1

Это невозможно. Если вы хотите, чтобы b.GetB повторно использовал функции a.GetA, вам необходимо создать экземпляр объекта a и вызвать a.GetA.

+1

Согласовано; предпочитают композицию, а не наследование. –

4

Общим способом создания композиции является создание частной переменной-члена в классе b, типа class a и в вызове GetB() a.GetA(). Например:

class a { 
    public void GetA(){ 
    // some logic here 
    } 
} 

class b { 
    private a _a=new a(); 

    public void GetB() 
    { 
     _a.GetA(); 
    } 
} 

Другим вариантом может быть, чтобы определить переменную-член делегат с именем GetB вместо простого метода и позволяет вызывающий код поставить код, который выполняется с помощью GetB().

+0

Не могли бы вы рассказать мне, какие преимущества делают это? Спасибо. – Tarik

+0

@ Аарон, преимущества этого такие же, как и преимущества использования композиции в целом. Это позволяет вам скрыть более подробную информацию о вашей реализации, а затем наследование. В этом примере вызывающим абонентам класса B не нужно знать, что вы фактически используете класс A для реализации GetB(). Таким образом, это обычно часто более гибкое и слабо связанное, чем наследование. – Ash

3

Ближайший вещь, которую я могу думать о том, как в C# вы можете «наследовать» конструктор класса, в том, что его дочернего класса (или перегруженный конструктор того же класса), например так:

class Animal { 
    public string Species { get; set; } 

    public Animal(string species) { 
     Species = species; 
    } 
} 

class Human : Animal { 
    public string Name { get; set; } 

    public Human(string name) : base("Homo sapien") { 
     Name = name; 
    } 
} 

Поведение вышеуказанного кода довольно просто: конструктор класса Human по существу вызывает конструктор класса Animal, прежде чем делать что-либо еще. Почему эта же функциональность недоступна для неконструкторских методов, я не уверен.

+0

«Домашний Sapien» - это аргумент, верно? – Tarik

+0

@Aaron: Да, в конструкторе 'Human',« Home sapien »передается как аргумент« species »для конструктора« Animal ». –

0

несколько иной подход был бы принять экземпляр ClassA в конструкторе ClassB, а не инстанцировании его непосредственно. Это было бы применение Dependency Inversion Principle к @ ответ Эша:

public class ClassB 
{ 
    private readonly ClassA _a; 

    public b(ClassA a) 
    { 
     _a = a; 
    } 

    public void GetB() 
    { 
     _a.GetA(); 

     // Other logic 
    } 
} 
0
public class Article 
{ 

public object AddOrUpdate(params object[] paras){ 

    return null; 

    } 

} 

public class Test:Article 
{ 

public new object AddOrUpdate(params object[] paras){ 

    //do your logic...... 

    return base.AddOrUpdate(paras); 

} 


} 

вы имеете в виду это это inhret класс может сделать получить или установить объект базового свойства.

Если вы работаете с делегатом, вы должны сделать больше работы с той же логикой.

, но делегат может получить объект с неоднородным доменом и сделать больше вещей, связанных с приложением.

0

Если Гет() изменяется на статический метод, вы можете просто вызвать его в GetB() функция:

class a { 
    public static void GetA() { 
    // some logic here 
    } 
} 

class b { 
    public void GetB() { 
     a.GetA(); 
    } 
} 

Если Гет() не является статическим, это не имеет смысл, так как гэта() по определению определяет контекст объекта (например, невидимый «этот» указатель). Вы не можете передать экземпляр объекта B в класс A, поскольку класс A ничего не знает о классе B.

Что вы действительно пытаетесь сделать?

Смежные вопросы