Rzutowanie z klasy bazowej

0

Witam!
Nie jestem zbyt biegly w C#, a chce napisac klase "ClassB" dla ktorej taki kod by dzialal:

 
using System;

class ClassA
{
    protected int value;
    public ClassA(int t)
    {
        value = t;
    }
}

class ClassB : ClassA
{
    ClassB(int t):base(t)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassA ObiektA = new ClassA(5);
        ClassB ObiektB = (ClassB)ObiektA;
    }
}

Nie mam pojecia jak zrobic aby to rzutowanie dzialalo. Probowalem czegos takiego w "ClassB":

public static explicit operator ClassB(ClassA t)
    {
        ...
    }

ale dostaje tylko:
Error 1 'ClassB.explicit operator ClassB(ClassA)': user-defined conversions to or from a base class are not allowed

Jak mam to w takim razie zrobic?
Pozdrawiam

0

Możesz rzutować sobie na interfejs, wtedy typy sprawdzi ci w runtime.
http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx
http://msdn.microsoft.com/en-us/library/cscsdfbt(v=vs.71).aspx

0

Znaczy nie za bardzo rozumiem. Chodzi o to zeby zamiast:

 
ClassB ObiektB = (ClassB)ObiektA;

uzyc?:

 
ClassB ObiektB = ObiektA as ObiektB;

Nie pomaga, to rzutowanie zwraca mi wartosc null...
Nie rozumiem co oznacza "rzutowanie na interfejs", jak to wyglada?
Dziekuje za zainteresowanie

0

Więc od początku:

  1. To co chcesz zrobić jest bardzo(!) nieeleganckie i na 99% wynika z błędnego designu. Po prostu źle to napisałeś i stąd potrzeba rzutowania w górę hierarchii. W większości przypadków wystarczy polimorfizm
  2. Możesz zdefiniować interfejs który zawiera pewne operacje. Potem jeśli masz referencję do obiektu pochodnego przedstawioną jako referencje do obiektu bazowego to rzutowanie na interfejs implementowany przez klasę pochodną można wykonać, bo typ będzie sprawdzony w run-time.
  3. Jeśli nie rozumiesz punktu 1 i 2 to znaczy ze musisz najpierw opanować podstawy, a potem do tego wrócić.
0

@Cypel - widziałeś kiedyś kota z płetwami?

...
class ClassB : ClassA
...
ClassA ObiektA = new ClassA(5);
ClassB ObiektB = (ClassB)ObiektA;
...

ClassA to ssak. ClassB to kot.
Ty chcesz wziąć ssaka i zrobić z niego kota. A co, jeśli ten ssak będzie delfinem?

Nie mam pojecia jak zrobic aby to rzutowanie dzialalo

Napisz, co naprawdę chcesz osiągnąć. Bo to, co próbujesz osiągnąć nie ma sensu w programowaniu.

0

Problem rozwiazany. Wszystkiemu byla winna moja pomylka. To co chcialem napisac to rozwiazanie do pewnego zadania, jednak niedokladnie przeczytalem tresc i nie zauwazylem ze mozna to rozwiazac w inny sposob. Rzeczywiscie, rzutowanie w gore hierarchii byloby troche bez sensu. Dziekuje za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1