很多时候,我从方法开始public,然后在完成后将它们降低到所需的最低水平,但这有点乏味。有没有一种方法可以自动将所有隐私修饰符(对于类和方法)一次性全部更改为尽可能低的值?
默认情况下,接口和实现接口的类中的方法是公共的。他们不需要提到的访问器。
为什么属性,特别是在实现接口的类中,需要提到公共访问修饰符?无论如何都不允许使用其他修饰符。
我试图了解将类变量设为私有而非公共的好处.我明白了getter/setter方法访问/修改私有/受保护的数据,但它的唯一目的就是"让我从我的压延数据"?示例:我不怎么说
$person->age = x;//bad?
Run Code Online (Sandbox Code Playgroud)
具有不同的破坏潜力
$person->set_x(x);//reccommended in OOP articles
Run Code Online (Sandbox Code Playgroud) 在我的另一个问题中,我已经提到了这个问题,但我认为值得将其分解为自己的问题,因为它并不真正依赖于我提到的其他场景.
无论如何 - 在Q上,不知道这是否可能.寻找解决方案/解决方法.
我有一个类库,只有POCO:
MyCompany.MyProject.Domain.POCO
Run Code Online (Sandbox Code Playgroud)
这个程序集有一个这样的POCO:
public class Post
{
public int PostId { get; set; }
public int Name { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我有另一个类库,它是我的DAL/Repository,并使用Entity Framework 4.0进行持久化:
MyCompany.MyProject.Repositories
Run Code Online (Sandbox Code Playgroud)
这个程序集引用了POCO项目,因为它需要在POCO上执行CRUD操作(抓取DB对象,项目进入POCO,返回,以及修改POCO).
现在,我还有一个Web应用程序,它同时引用了POCO和Repository程序集.
如果我这样做:
somePOCO.PostId = 10;
Run Code Online (Sandbox Code Playgroud)
我得到一个SQLException,因为PostId是数据库中的IDENTITY字段,因此不应该明确设置.
有没有办法可以隐藏这些特殊属性的setter,以便只有存储库可以访问setter?
我想不出用常规辅助功能修饰符来做到这一点的方法(因为它们都不适合这种情况),你们能想到一个解决方法吗?
我准备SCJP,我也知道受保护的成员范围在包内以及其他包中,只有继承才有可能.
例如:我有三个类作为Parentclass Childclass Friendclass
package x.parent;
class Parentclass{
protected int x=10;
...............
}
package x.child;
class Childlass extends Parentclass{
super.x=20;
...............
}
package x.child;
import x.parent.Parentclass;
class Friendclass{
Parentclass pc = new Parentclass();
pc.x=30;
...............
}
Run Code Online (Sandbox Code Playgroud)
这背后的原因是什么,在Friendclass中,成员x不接受为其赋值,在不是Childclass的情况下表现为私有成员.
我有问题弄清楚为什么我接收"未设置为对象实例的对象引用"此表示层中的错误:
TempAccountManager.Accounts.Add(tempAccount);
我已经使用Visual Studios调试器和帐户获取创建了代码.我相信我有一个访问模块的问题,不确定.
表达层
using myBudget.BusinessObject;
using myBudget.BusinessLogic;
namespace myBudget
{
public partial class NewBudgetWizard : Form
{
public int CurrentStep { get; set; }
public Account TempAccount = new Account();
public AccountManager TempAccountManager = new AccountManager();
public NewBudgetWizard()
{
private void createAccountList(ListView lvAccounts)
{
foreach (ListViewItem lvi in lvAccounts.Items)
{
int tempAccNumber = Int32.Parse(lvi.SubItems[0].Text);
string tempAccName = lvi.SubItems[1].Text;
string tempAccType = lvi.SubItems[2].Text;
decimal tempAccBalance = decimal.Parse(lvi.SubItems[3].Text, System.Globalization.NumberStyles.Currency);
Account tempAccount = new Account(tempAccNumber, tempAccName, tempAccType, tempAccBalance, DateTime.Now);
TempAccount = …Run Code Online (Sandbox Code Playgroud) c# oop access-modifiers object-reference nullreferenceexception
我现在就是这样做的:
protected bool __myMember = true;
bool myMember { public get { return __myMember; } protected set { __myMember = value; } }
Run Code Online (Sandbox Code Playgroud)
这是我理想的做法(或非常类似的东西):
public-get protected-set bool myMember = true;
Run Code Online (Sandbox Code Playgroud)
这可能吗?或者还有其他方法可以缩短我目前的工作方式吗?我不应该这样做吗?
也许解决方案是如果我们可以在csharp中创建修饰符......但我怀疑我们可以.
我有两个课程,这是我的代码:
//My Base class
public class People
{
public People()
{
}
protected string name;
protected string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
}
//The Child class
public class Student:People
{
private int id;
public Student()
{
}
public Student (int id, string name)
{
this.id = id;
this.Name = name;
}
public int ID
{
get
{
return this.id;
}
set
{
this.id = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建Student类的实例(如下面的实例)时,我无法从父类People中访问NAME属性。
public partial …Run Code Online (Sandbox Code Playgroud) 所以这让我感到困惑.
假设有两个接口.
public interface a
{
void foo();
}
public interface b
{
void foo();
}
Run Code Online (Sandbox Code Playgroud)
这两个接口都有一个函数foo,我有一个提供显式实现的类:
public class alpha : a, b
{
// why can't I put an access modifier here?
// How would you be able to hide this from a derived class
void a.foo()
{
Console.WriteLine("a");
}
void b.foo()
{
Console.WriteLine("b");
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个派生自alpha的类
public class beta : alpha
{
}
Run Code Online (Sandbox Code Playgroud)
你如何使foo私有或受保护,因为alpha不允许在显式的imlementation上访问修饰符,什么可以阻止某人调用:
var be = new beta();
(be as b).foo();
Run Code Online (Sandbox Code Playgroud)
编辑
为什么我没有明确提供实现我可以提供访问修饰符?
public class alpha : …Run Code Online (Sandbox Code Playgroud) c# encapsulation interface access-modifiers multiple-inheritance
如何从一种形式访问私有方法到另一种形式?
例如,我在Form1中有这个方法:
Form1中:
private void Test (){}
Run Code Online (Sandbox Code Playgroud)
那么如何在Form2中访问该方法(private void Test),以便我在Form2中输入的值将在方法Test中发送?
Test是一个datagridview,在表单2中,我必须在其中输入带有相应值的Name,如果我按下save按钮,它应该自动保存在Form1中的datagridview中.
access-modifiers ×10
c# ×7
interface ×2
java ×2
oop ×2
.net ×1
assemblies ×1
polymorphism ×1
properties ×1
winforms ×1