c#中如何具体实现建立一个基类,然后建立一个继承类,而且两个类处在同一命名空间,具体步骤谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中如何具体实现建立一个基类,然后建立一个继承类,而且两个类处在同一命名空间,具体步骤谢谢!相关的知识,希望对你有一定的参考价值。

using System;
using System.IO.Ports;
using System.Threading;
namespace TripodDemo

public abstract class ComPort : IDisposable这是基类

using System;
using System.IO.Ports;
using System.Text;
namespace TripodDemo

public class SerialQ01 : ComPort这是子类
已经有这两个类的代码,如何放在VS中呢

参考技术A 刚才解答了这个问题
http://zhidao.baidu.com/question/537154755?&oldq=1
在最后面有介绍怎么放vs里追问

如果是代码 直接在vs中建立好的项目中新建类文件把代码粘贴里面,调用的时候引用下代码的namespace命名空间

这是你的原话,但我觉得应该是新建类库吧,新建类的话就是图中的样子,就没法引用命名空间了吧

追答

都是差不多的新建类库利于管理,如果只是一个小功能就不要新建类库了,类库多了也麻烦的
namespace a
public class ab

using a;
public class c
这里就可以直接用ab的实例了
ab e=new ab();

追问

新建类的话好像不行呀,里面出错  我已经using TripodDemo;了

追答

那就用类库吧新建类库肯定是可以的

追问

但你能不能告诉我,这个为什么不行呀,是不是新建类的时候有问题

追答

框架的问题吧,在webform上就可以的,但是我用mvc也出现无法引用的问题还是我们队框架了解的不够彻底,实际上直接新建类是可行的我们没找对方法吧

追问

恩,还有个问题问下你,就是关于类的继承到底怎么用?我已经有了一个一个类库dll,里面有我需要的类,后来我又需要这个类里面增加一些函数,是不是吧这个dll拿出来增加一些函数,然后替换原来的dll?但也没用到继承呀,继承该怎么用?

追答

这种情况可以用传统的子类继承,如果是无法继承的类,可以使用NET新特性中的“扩展方法”,具体的内容很多篇幅,可以找些资料看下

本回答被提问者采纳
参考技术B 怎么放也行,放在一个文件里也可穿,放在两个文件里也可以,没什么限制。 参考技术C namespace 相同就行了追问

能不能具体点呀,我是新手,现在已经有这两个类的代码了,但不知道怎么放进VS里面

如何从用 C# 编写的抽象基类继承

【中文标题】如何从用 C# 编写的抽象基类继承【英文标题】:How to inherit from an abstract base class written in C# 【发布时间】:2017-02-01 05:41:40 【问题描述】:

我正在尝试使用 Python.NET (2.1.0) 从 Python (2.7) 中的抽象 .NET 基类继承。我是 Python n00b,但据我了解……

这是我仅在 Python 中成功完成的,并且效果很好:

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)

现在,我所做的只是将抽象基类 Door 替换为 C# 表示:

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 部件中删除 Door 并从 .NET 程序集中导入它,我最终得到以下结果:

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)

但这会失败并显示以下错误消息:

    Door.register(StringDoor)
AttributeError: type object 'Door' has no attribute 'register'

根据我对abc.ABCMeta 的了解,这个元类贡献了register() 方法。似乎抽象 C# 类不带有相同的元类。相反,它们带有元类CLR Metatype,它显然不提供register()

但如果我放弃对 register() 的调用,在实例化派生类之一时,我会收到错误消息

    sdoor = StringDoor()
TypeError: cannot instantiate abstract class

有没有办法从抽象的 .NET 类继承或者这是一个缺失的特性?

提前致谢,

亨宁

【问题讨论】:

@TomHunter 这里是邮件列表中的原始讨论:mail.python.org/pipermail/pythondotnet/2016-September/… 嗨@denfromufa,您好像是说您不能使用Python 和Python.Net 从.NET 抽象类继承。请您确认一下吗?谢谢 @TomHunter 我不认为这个功能是在 pythonnet 中实现的。随时在问题跟踪器中提交功能请求。 【参考方案1】:

您不能在 C# 中创建抽象类的新实例。也就是说,Python 将要求您使用寄存器,因为它不允许您在未注册的情况下使用继承的类,除非您实例化它。

如果你想从 python 中的 C# 抽象类继承,你必须在你的 C# 类中自己编写 python 中 register 类的表示,从而注册你的抽象调用并能够从它继承。

如果需要,我建议您使用此网站轻松帮助您在代码之间进行转换:

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

【讨论】:

【参考方案2】:

我完全不熟悉 pythonnet(或一般的 python),但我很好奇这样的东西是否可行:

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)

【讨论】:

以上是关于c#中如何具体实现建立一个基类,然后建立一个继承类,而且两个类处在同一命名空间,具体步骤谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

C#基础学习之继承

抽象类指针

《C#高级编程》读书笔记

c#核心基础--类的继承

C++ 抽象类 (abstract class)

为啥 C# 中的基类允许实现接口契约而不继承它?