Тип конверсии - PullRequest
       15

Тип конверсии

1 голос
/ 24 марта 2010

У меня следующий вопрос.
У меня есть один класс "Instellingen", это поле в 3 других классах

    public class Instellingen
    {
        private int _ID;
    }
    public class Class1: Button
    {
        private Instellingen _Instellingen;
    }
    public class Class2 : Label
    {
        private Instellingen _Instellingen;
    }
    public class Class3 : TextBox
    {
        private Instellingen _Instellingen;
    }

Если у меня есть другой класс, который использует другие классы (но это может быть любой из этих 3 классов) Должен ли я использовать переключатель? или есть более простой способ?

    public class AnotherClass
    {
        public AnotherClass ()
        {
            GetInstellingenFromClass(new Class1());
            GetInstellingenFromClass(new Class2());
            GetInstellingenFromClass(new Class3());
        }
        private void GetInstellingenFromClass(Control c)
        {
            switch (c.GetType.ToString())
            {
                case "Class1":
                    Class1 klasse = (Class1) c;
                    //Do something with the _Instellingen of this class
                    break;
                case "Class2":
                    Class2 klasse2 = (Class2) c;
                    //Do something with the _Instellingen of this class
                    break;
                case "Class3":
                    Class3 klasse3 = (Class3)c;
                    //Do something with the _Instellingen of this class
                    break;

            }
        }
    }

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

Надеюсь, вы понимаете мой вопрос.

Спасибо

Ответы [ 5 ]

5 голосов
/ 24 марта 2010

Вы должны создать интерфейс , который имеет свойство Instellingen и реализовать его в трех классах.

Например:

interface IHasInstellingen {
    Instellingen Instellingen { get; }
}

public class Class1: Label, IHasInstellingen {
    public Instellingen Instellingen { get; private set; }
}
public class Class2: Button, IHasInstellingen {
    public Instellingen Instellingen { get; private set; }
}


private void GetInstellingenFromClass(IHasInstellingen c) {
    Instellingen ig = c.Instellingen;
    //Do things...
}
//Alternatively:
private void GetInstellingenFromClass(Control c) {
    IHasInstellingen hi = c as IHasInstellingen;
    if (hi == null)
        return;     //Or throw an ArgumentException

    Instellingen ig = hi.Instellingen;
    //Do things...
}
1 голос
/ 24 марта 2010

Нет, вам не нужно использовать переключатель. На самом деле концепция Интерфейс - это то, что вы ищете. Что-то вроде;

public interface IIntelingenProvider
{
    Intelingen Item {get;}
}

public class Class1: Label, IIntelingenProvider
{
    private Instellingen _Instellingen;
    public Intelingen Item { get { return _Instellingen; } }
}

public class Class2: Label, IIntelingenProvider
{
    private Instellingen _Instellingen;
    public Intelingen Item { get {return _Instellingen; } }
}

И тип, который вы собираетесь предоставить методу GetInstellingenFromClass, будет IIntelingenProvider. Следовательно, вы можете написать это как

    private void GetInstellingenFromClass(IIntelingenProvider c)
    {
        // regardless of the type, they all have an Item property of type Intelingen
        // c.Item
    }

Я предлагаю вам прочитать и узнать больше о Interitance и Polymorphism

1 голос
/ 24 марта 2010

Полиморфизм . В вашем случае все классы расширяются Label, поэтому вы можете Label определить ваш Instellingen:

public class Label
{
    public Instellingen Instellingen
    {
        get { return ...; }
    }
}

Тогда AnotherClass может просто работать с Label s:

    private void GetInstellingenFromClass(Label l)
    {
        var instellingen = l.Instellingen;

        // do something with instellingen here
    }

Конечно, если у вас нет класса Label, вы всегда можете создать его подкласс и использовать его в своих классах. Другой вариант - определить интерфейс со свойством и иметь AnotherClass в зависимости от этого интерфейса.

0 голосов
/ 24 марта 2010

Рассмотрите возможность использования интерфейса для предоставления свойства Instellingen в нужных им классах.

class Instellingen
{
    public int ID { get; set; };
}
interface IHasInstellingen
{
    Instellingen Instellingen { get; set; }
}

class MyLabel: Label, IHasInstellingen
{
    public Instellingen Instellingen { get; set; }
}
class MyButton: Button, IHasInstellingen
{
    public Instellingen Instellingen { get; set; }
}

class AnotherClass
{
    public AnotherClass ()
    {
        GetInstellingenFromClass(new MyLabel());
        GetInstellingenFromClass(new MyButton());
        // ...
    }
    private void GetInstellingenFromClass(IHasInstellingenc)
    {
        Console.WriteLine( c.Instellingen.ID );
        // ... Do something with Instellingen
    }
}
0 голосов
/ 24 марта 2010

Вместо того, чтобы каждый из трех ваших классов был производным от Label, вы можете создать промежуточный базовый класс, такой как LabelWithInstellingen?

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