首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现抽象类的约束接口?

如何实现抽象类的约束接口?
EN

Stack Overflow用户
提问于 2016-04-27 05:08:16
回答 2查看 455关注 0票数 2

几天前,我尝试使用(引用)一个在unsuccesfully中没有接口的QRCode库.net。所以我做了一些研究,这里的人指导了我。因此,我决定按照以下步骤制作界面https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/

我看到了intellisense,并创建了其他类的一些对象和变量,但是我遇到了一个类的麻烦,在这个类中,我看到了Dispose(),但是我不能在ms access中使用New:

代码语言:javascript
运行
复制
[Dim QRCD as New QRCode]

我得到一个错误,使用New是无效的,但是我可以用行声明:

代码语言:javascript
运行
复制
Dim QRCD as QRCode

我认为这不是一个对象{如果我试图使它等于QRData --“没有权限”--该类实现了一个具有约束的抽象类--我试图将接口放在抽象类中,并且我得到了错误“不实现方法”,如果我把它放在子类中,我不能创建一个对象,也不能看到任何带有后期绑定的方法。QRCoder库可以在这里找到。https://github.com/codebude/QRCoder,这是抽象类,因为它是提供的。

代码语言:javascript
运行
复制
{
using System;

public abstract class AbstractQRCode<T>
{
    protected QRCodeData qrCodeData;

    protected AbstractQRCode(QRCodeData data)
    {
        qrCodeData = data;
    }
    public abstract T GetGraphic(int pixelsPerModule);
}

}

这是实现它的子类;它已经用接口进行了修改。并不是所有的代码,而是下面的几个方法,它们都被称为GetGraphic(某种东西),它们彼此不同。

代码语言:javascript
运行
复制
    [ComVisible(true)]
[Guid("It's filled in the program"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface neker
{

    Bitmap GetGraphic(int pixelsPerModule);
}
[ComVisible(true)]
[Guid(""), ClassInterface(ClassInterfaceType.AutoDual)]

public class QRCode :AbstractQRCode<Bitmap>, IDisposable, neker
{
    public QRCode(QRCodeData data) : base(data) {}

    public override Bitmap GetGraphic(int pixelsPerModule)
    {
        return GetGraphic(pixelsPerModule, Color.Black, Color.White, true);
    }

    public Bitmap GetGraphic(int pixelsPerModule, string darkColorHtmlHex, string lightColorHtmlHex, bool drawQuietZones = true)
    {
        return GetGraphic(pixelsPerModule, ColorTranslator.FromHtml(darkColorHtmlHex), ColorTranslator.FromHtml(lightColorHtmlHex), true);
    }

这是示例代码(也提供了)

代码语言:javascript
运行
复制
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = qrCode.GetGraphic(20);

这是我在VBA中的代码,这是一个模块

代码语言:javascript
运行
复制
Public Sub QRCreator(QRtext As String)
Dim QRCG As QRCoder.QRCodeGenerator
Set QRCG = New QRCoder.QRCodeGenerator
Dim QRCD As QRCodeData
Set QRCD = QRCG.CreateQRCode(QRtext, ECCLevel_Q, False)
Dim QRCO As QRCode
Set QRCO = Factory.CreateQRCode(QRCD)
Forms!Formulario1.[Oleobject].Picture = QRCO.GetGraphic(5)
End Sub

Public Sub InitiateProperties(Data As QRCodeData)
//I declared it as Variant since QRCode is not avaliable
Dim m_data As Variant
m_data = Data
End Sub

这在另一个模块I use this modules to create the object with parameters中。

代码语言:javascript
运行
复制
Public Function CreateQRCode(Data As QRCodeData) As QRCode
//you see the word new is missing If I run it it says "An object is required"

Set CreateQRCode = QRCode
CreateQRCode.InitiateProperties Data:=Data

End Function

如何将其修改为可从microsoft 2013中使用?是另一种没有接口的方法吗?access是否支持vba中的位图?我对这些东西都是新手,所以非常感谢你。

编辑:我不能让IT工作的原因是COM可见的,它支持带有参数的构造函数,支持重写的方法。那么,答案是我如何能够创建图像无论如何。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-12 23:00:02

在检查、尝试和失败之后,我决定改变我的观点。所以我做了这个

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Interop;
using System.Runtime.InteropServices;
using stdole;
namespace QRCoder
{
[Guid("52724C82-F18C-460B-B48D-1F19E016F86E")]
[ComVisible (true) , InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IQRCodeGene
{
    string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule);
}
[Guid("4F445AA5-D642-438B-A69A-429D621A3CB0")]
[ComVisible (true), ClassInterface(ClassInterfaceType.None)]
   public class QRCodeGene: IQRCodeGene, IDisposable
{
    private QRCodeGenerator Instance;
    public QRCodeGene()
    {
        Instance = new QRCodeGenerator();
    }
    public string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule)
    {
        var qrCodeData = Instance.CreateQrCode(text, value);
        var qrCode = new QRCode(qrCodeData);
        var bitmap = qrCode.GetGraphic(pixelsPerModule);
// This line is the only modified by the provided in the code above.
        bitmap.Save("C:\\"+text+".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
//I return this string for testing. I guess If removed the text wouldn't work.
        return ("Hello");
    }
    public void Dispose()
    {
        Instance.Dispose();
    }

}
}

上面的代码生成了我在access VBA中通过这个函数发送的任何东西的QRCode:

代码语言:javascript
运行
复制
Public Sub QR(Text As String)
Dim QRC As New QRCodeGene
Dim x As String
x = QRC.Create(Text, ECCLevel_Q, 5)

End Sub

在此之后,我只加载由和access.image控件源生成的图片。谢谢弗洛伦特B.提供了这个代码。

票数 1
EN

Stack Overflow用户

发布于 2016-04-27 06:47:08

您的COM对象无法创建,因为该类没有默认构造函数。与其尝试公开原始API,不如创建一个具有与您的需要相匹配的方法的类:

VBA的使用:

代码语言:javascript
运行
复制
Public Sub QRCreator(text As String)
  Dim qrc As New QRCoder.QRCodeGenerator
  Forms!Formulario1.[Oleobject].Picture = qrc.Create(text, CCLevel_Q, 5)
End Sub

.Net:

代码语言:javascript
运行
复制
[Guid("C7CC4CA0-813A-431E-B92C-842A07735E72")]
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface _QRCodeGenerator {

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule);

}


[ProgId("QRCoder.QRCodeGenerator")]
[Guid("4DC2C1F8-2727-4120-80E1-8475650D8547")]
[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
[Description("...")]
public class QRCodeGenerator : _QRCodeGenerator, IDisposable {

    private QRCoder.QRCodeGenerator instance;

    public QRCodeGenerator() {
        instance = new QRCoder.QRCodeGenerator();
    }

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule){
        var qrCodeData = instance.CreateQrCode(text, cclevel);
        var qrCode = new QRCoder.QRCode(qrCodeData);
        var bitmap = qrCode.GetGraphic(pixelsPerModule);
        return ImageToPicture(bitmap);
    }

    public void Dispose() {
        instance.Dispose();
    }

    private static IStdPicture ImageToPicture(Bitmap bitmap) {
        ...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36880780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档