SORU
7 EKİM 2008, Salı


C birden çok Devralma#

Çoklu kalıtım kötü (kaynak karmakarışık hale getiriyor) olduğundan C# böyle bir düzeni tam olarak sağlamaz. Ama bazen bu yetenek için yararlı olacaktır.

Örneğin kayıp çoklu kalıtım modelini arabirimleri ve böyle üç sınıfları kullanarak uygulamak mümkün oldum:

public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }

public class First:IFirst 
{ 
    public void FirstMethod() { Console.WriteLine("First"); } 
}

public class Second:ISecond 
{ 
    public void SecondMethod() { Console.WriteLine("Second"); } 
}

public class FirstAndSecond: IFirst, ISecond
{
    First first = new First();
    Second second = new Second();
    public void FirstMethod() { first.FirstMethod(); }
    public void SecondMethod() { second.SecondMethod(); }
}

Her zaman sınıf değiştirmek istiyorum arabirimleri biri için bir yöntem ekleyinFirstAndSecondde.

Bir şekilde C mümkün olduğu gibi yeni bir sınıf birden fazla mevcut sınıflar enjekte var mı ?

Belki bir çözüm kod oluşturma falan kullanan var mı?

Ya da bu gibi (hayali c# sözdizimi) görünebilir:

public class FirstAndSecond: IFirst from First, ISecond from Second
{ }

Ben arabirimlerinden birini değiştirdiğinizde sınıf FirstAndSecond güncellemek için bir ihtiyaç olmayacak.


EDİT

Belki daha pratik bir örnek, dikkate almak iyi olurdu:

Zaten proje içinde farklı yerlerde kullanmak hangi varolan bir sınıf var (metin tabanlı bir TCP istemci İTextTcpClient dayalı gibi). Şimdi kendi sınıfının bir bileşeni kolay windows için erişilebilir olması için oluşturmak için gereken geliştiriciler formları hissediyorum.

Şu anda bunu yapmak için iki yol var bildiğim kadarıyla:

  1. Bileşenleri miras ve FirstAndSecond ile gösterildiği gibi TextTcpClient sınıfı arabirim sınıfının bir örneğini kullanarak kendisi uygulayan yeni bir sınıf yazmak.

  2. TextTcpClient ve bir şekilde uygular IComponent devralan yeni bir sınıf (aslında henüz bunu denemedim) yazma.

Her iki durumda da yöntem iş başı ve sınıf başına değil yapmanız gereken. TextTcpClient ve Bileşeni tüm yöntemleri ihtiyacımız olacak biliyorum beri, sadece bir sınıf içine bu iki birleştirmek için en kolay çözüm olurdu.

Bu sonuç daha sonra değişmiş olabilir kod oluşturma tarafından yapılabilir çatışmaları önlemek için ama bunları elle yazarak kıçından saf bir acı.

CEVAP
7 EKİM 2008, Salı


Sadece kullanmayı düşününcompositionçalışmak yerine Birden çok Devralma taklit. Kullanabilirsiniz Arabirimleri tanımlamak için ne derslerini vermek bileşimi, örneğin: ISteerable ima bir özellik tipi SteeringWheel, IBrakable ima bir özellik tipi BrakePedal, vb.

Bunu yaptıktan sonra, Bu örtük özellikleri Extension Methods özelliği C# 3.0 daha fazla arama yöntemleri kolaylaştırmak için eklendi, örneğin kullanabilirsiniz:

public interface ISteerable { SteeringWheel wheel { get; set; } }

public interface IBrakable { BrakePedal brake { get; set; } }

public class Vehicle : ISteerable, IBrakable
{
    public SteeringWheel wheel { get; set; }

    public BrakePedal brake { get; set; }

    public Vehicle() { wheel = new SteeringWheel(); brake = new BrakePedal(); }
}

public static class SteeringExtensions
{
    public static void SteerLeft(this ISteerable vehicle)
    {
        vehicle.wheel.SteerLeft();
    }
}

public static class BrakeExtensions
{
    public static void Stop(this IBrakable vehicle)
    {
        vehicle.brake.ApplyUntilStop();
    }
}


public class Main
{
    Vehicle myCar = new Vehicle();

    public void main()
    {
        myCar.SteerLeft();
        myCar.Stop();
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • graham025

    graham025

    25 NİSAN 2006
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • Soulkiller13 ツ

    Soulkiller13

    30 Mayıs 2013