c#inheritance只从一个派生类隐藏方法

时间:2018-03-09 14:31:41

标签: c# inheritance hide

我有一个使用MVC构建的零售WebSite。调用REST WebAPI服务以提供基本的CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的数据库表结构匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,无论如何都要隐藏零售网站上的方法,同时仍然让它们对API可见?

我目前正在做什么(哪些不起作用)是在WebSite中创建一个继承自DLL中的类的类。这让我从DLL获取模型,但从技术上讲,它也可以让我调用方法与数据库进行交互。

以下是一个例子:

在DLL中

    public class Account {
        public int AccountId { get; set; }
    }

    public int RetrieveAccountId {
        // Hit the database to retrieve the current account id...
    }

零售MVC网站

    public class mmAccount : Account {
    }

现在,在零售mvc网站上,我可以说mmAccount.AccountId

在Web API中,我可以直接调用函数RetrieveAccountId:

    Account account = new Account();
    account.RetrieveAccountId();

问题是,我在技术上也可以通过WebSite中的mmAccount(从Account中派生)来实现。无论如何,我只能从WebSite中隐藏该方法吗?

3 个答案:

答案 0 :(得分:1)

可以标记方法$output = shell_exec("/usr/bin/ffmpeg -i in.mp3 -b:a 96k out.mp3"); echo $output; 并使用internalsVisibleTo Attribute

虽然感觉有点笨拙。我个人之间有一个服务层 - 网站永远不会直接看到数据库模型;它只接收由某种形式的服务填充的DTO对象。通过这种方式,如果您的底层数据库结构发生变化,网站并不关心,并且永远不需要知道基础数据库的内容是什么'一个实体是......

答案 1 :(得分:0)

这取决于 - 如果你想有选择地允许这种继承,你可能希望使用接口和管理器或工厂将实例提供给WebAPI版本,接口不允许你不使用的功能想。
如果您不需要在其他位置继承.RetreiveAccountId()函数,则可以将其设置为internal或(使用C#7.2)private protected。内部将允许同一程序集中的其他类使用该方法,而private protected将允许同一程序集中的派生类(但不是不同程序集中的派生类)使用该函数。

答案 2 :(得分:0)

要隐藏子类中的方法,您必须使用new关键字在子类中重新定义它的功能。

public class mmAccount : Account {
    public new int RetrieveAccountId {
        throw new WhatDoYouThinkYouAreDoingException("You are not allowed!");
    }
}

对mmAccount.RetrieveAccountId()的任何调用都将通过此新方法进行路由。 这样做的缺点是以下仍然会给出原始回报:

mmAccount mAcc = new mmAccount();
Account acc = mAcc as Account;
int id = acc.RetrieveAccountId();

要真正解决这个问题,您必须更改有关父类的内容(例如,使用虚拟方法并覆盖它)