C#

2016-09-23 18 views
20

ile yazılmış bir soyut temel sınıfından nasıl devralınırım Python (2.7) 'daki bir soyut .NET temel sınıfından Python.NET (2.1.0) kullanarak miras almaya çalışıyorum. Ben burada C#

Ben sadece Python yapmayı başardı ve iyi çalışır hangi budur ... Ben anladım ne Python n00b ama değilim:

import abc 

class Door(object): 
    __metaclass__ = abc.ABCMeta 

    def open(self): 
     if not self.is_open(): 
      self.toggle() 

    def close(self): 
     if self.is_open(): 
      self.toggle() 

    @abc.abstractmethod 
    def is_open(self): 
     pass 

    @abc.abstractmethod 
    def toggle(self): 
     pass 

class StringDoor(Door): 
    def __init__(self): 
     self.status = "closed" 

    def is_open(self): 
     return self.status == "open" 

    def toggle(self): 
     if self.status == "open": 
      self.status = "closed" 
     else: 
      self.status = "open" 

class BooleanDoor(Door): 
    def __init__(self): 
     self.status = True 

    def is_open(self): 
     return self.status 

    def toggle(self): 
     self.status = not (self.status) 

Door.register(StringDoor) 
Door.register(BooleanDoor) 

Şimdi, tüm yaptığım soyut temel sınıf Kapı değiştirmekti bir C# gösterimi ile:

namespace PythonAbstractBaseClass 
{ 
    public abstract class Door 
    { 
     public virtual void Open() 
     { 
      if (!IsOpen()) 
       Toggle(); 
     } 

     public virtual void Close() 
     { 
      if (IsOpen()) 
       Toggle(); 
     } 

     public abstract bool IsOpen(); 
     public abstract void Toggle(); 
    } 
} 

Python bölümünden Kapı Çıkarma ve yerine NET montaj aktararak, bu ile sonuna kadar:

import clr 
import abc 
from PythonAbstractBaseClass import Door 

class StringDoor(Door): 
    def __init__(self): 
     self.status = "closed" 

    def is_open(self): 
     return self.status == "open" 

    def toggle(self): 
     if self.status == "open": 
      self.status = "closed" 
     else: 
      self.status = "open" 

class BooleanDoor(Door): 
    def __init__(self): 
     self.status = True 

    def is_open(self): 
     return self.status 

    def toggle(self): 
     self.status = not (self.status) 

Door.register(StringDoor) 
Door.register(BooleanDoor) 

Ama bu şu hata iletisiyle başarısız olur:

anladım kadarıyla
Door.register(StringDoor) 
AttributeError: type object 'Door' has no attribute 'register' 

yaklaşık abc.ABCMeta, bu metaclass register() yöntemi katkıda bulunur. Görünüşe göre soyut C# sınıfları aynı metaclass ile gelmiyor. Bunun yerine, register()'u sağlamayacak şekilde CLR Metatype meta sınıfı ile birlikte gelirler.

Ben türetilmiş sınıfları birini başlatmak üzerine, register() çağrısına damla Ama eğer, şu hata mesajını

sdoor = StringDoor() 
TypeError: cannot instantiate abstract class 

soyut bir .NET sınıfından miras için bir yol var mı alacak yoksa bu eksik

özelliği? peşin

sayesinde

Henning

+0

@TomHunter posta listesindeki orijinal tartışma: böyle bir şey işe yarayabilecek eğer meraklı 'm https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa

+0

Merhaba @denfromufa, senin gibi görünüyor Python ve Python.Net kullanarak bir .NET soyut sınıfından miras kalamayacağınızı söyleyerek .. teyit edebilir misiniz? Teşekkürler –

+0

@TomHunter Bu özelliğin pythonnet'te uygulandığını düşünmüyorum. Konu izleyicide bir özellik isteği göndermek için çekinmeyin. – denfromufa

cevap

8

Sen C# soyut bir sınıfın yeni bir örneğini oluşturamazsınız. dedi ki, Python, siz yazdığınız sürece, kalitenizi sınıfa kaydolmadan kullanmanıza izin vermeyeceği için, sicili kullanmanızı gerektirecektir. Eğer python bir C# soyut sınıfından miras istiyorsanız

, siz, C# sınıfında kendi başınıza Python kayıt sınıfının temsili yazmak zorunda kalacak, böylece soyut çağrı kayıt ve ondan devralan edebilmek .

bu siteyi öneririm

kolayca gerek eğer sen kodları arasında dönüştürmek yardımcı olmak için:

https://www.varycode.com/converter.html

5

I (bu konuda genel olarak veya piton) pythonnet ile tamamen aşina değilim ama burada

import clr 
import abc 
from PythonAbstractBaseClass import Door 

class DoorWrapper(Door): 
    __metaclass__ = abc.ABCMeta 

class StringDoor(DoorWrapper): 
    ... 

class BooleanDoor(DoorWrapper): 
    ... 

DoorWrapper.register(StringDoor) 
DoorWrapper.register(BooleanDoor)