Tôi nhầm lẫn là tại sao toán tử new
không hoạt động như tôi mong đợi.Toán tử mới trong C# không ghi đè thành viên lớp cơ sở
Lưu ý: Tất cả các lớp bên dưới được xác định trong cùng một không gian tên và trong cùng một tệp.
Lớp này cho phép bạn thêm tiền tố vào bất kỳ nội dung nào được ghi vào bảng điều khiển với một số văn bản được cung cấp.
public class ConsoleWriter
{
private string prefix;
public ConsoleWriter(string prefix)
{
this.prefix = prefix;
}
public void Write(string text)
{
Console.WriteLine(String.Concat(prefix,text));
}
}
Đây là một lớp cơ sở:
public class BaseClass
{
protected static ConsoleWriter consoleWriter = new ConsoleWriter("");
public static void Write(string text)
{
consoleWriter.Write(text);
}
}
Dưới đây là một lớp thực hiện:
public class NewClass : BaseClass
{
protected new static ConsoleWriter consoleWriter = new ConsoleWriter("> ");
}
Bây giờ đây là mã để thực hiện điều này:
class Program
{
static void Main(string[] args)
{
BaseClass.Write("Hello World!");
NewClass.Write("Hello World!");
Console.Read();
}
}
Vì vậy, tôi mong đợi đầu ra là
Hello World!
> Hello World!
Nhưng đầu ra là
Hello World!
Hello World!
Tôi không hiểu tại sao điều này đang xảy ra. Đây là quá trình suy nghĩ của tôi về những gì đang xảy ra:
- Các CLR gọi
BaseClass.Write()
phương pháp - Các CLR initialises các
BaseClass.consoleWriter
thành viên. - Phương pháp này được gọi và thực hiện với các
BaseClass.consoleWriter
biến
Sau đó
- Các CLR gọi
NewClass.Write()
- Các CLR initialises đối tượng
NewClass.consoleWriter
. - Các CLR thấy rằng việc thực hiện nằm trong
BaseClass
, nhưng phương pháp này là thừa hưởng qua - Các CLR thực hiện phương pháp này tại địa phương (trong
NewClass
) sử dụngNewClass.consoleWriter
biến
Tôi nghĩ đây là cách cấu trúc thừa kế công trinh?
Xin vui lòng ai đó có thể giúp tôi hiểu tại sao điều này không hoạt động?
-
Cập nhật:
Kịch bản này sẽ làm việc như sau (làm thế nào tôi đã thực hiện nó)
public class LogBase
{
protected static TraceSource logger = new TraceSource("");
public static void Error (string text) { logger.WriteError(text); }
public static void Info (string text) { logger.WriteInformation(text); }
public static void Warning (string text) { logger.WriteWarning(text); }
public static void Verbose (string text) { logger.WriteVerbose(text); }
}
// DataAccess logging
public class DALog : LogBase
{
protected new static TraceSource logger = new TraceSource("DataAccess");
}
// BusinessObjects logging
public class BOLog : LogBase
{
protected new static TraceSource logger = new TraceSource("Objects");
}
// BusinessLogic logging
public class BLLog : LogBase
{
protected new static TraceSource logger = new TraceSource("Logic");
}
// WebUI logging
public class WebUILog : LogBase
{
protected new static TraceSource logger = new TraceSource("WebUI");
}
Lý do là tôi không cần phải lặp lại mã cho mọi lớp học.
-
Cập nhật (sau khi giải pháp được lựa chọn):
Vì vậy, để có được xung quanh vấn đề này, thay vì sử dụng các lớp cơ sở, tôi đã xác định các chức năng một. Sau đó, tạo các lớp học mới, tổ chức các cá thể Singleton cho mỗi lớp:
public sealed class LogBase
{
private TraceSource logger = null;
public static LogBase GetLogger(string loggerName)
{
return new LogBase(loggerName);
}
private LogBase(string loggerName) { logger = new TraceSource(loggerName); }
public void Error (string text) { logger.WriteError(text); }
public void Info (string text) { logger.WriteInformation(text); }
public void Warning (string text) { logger.WriteWarning(text); }
public void Verbose (string text) { logger.WriteVerbose(text); }
}
// DataAccess logging - no base class
public class DALog
{
private static LogBase logger;
public static LogBase Instance
{
get
{
if (logger==null) { logger = new TraceSource("DataAccess"); }
return logger;
}
}
}
...
Tôi không thể khai báo các phương thức tĩnh là ảo. Có lẽ tôi nên trả về một thể hiện của lớp và sau đó gọi các phương thức không tĩnh để giải quyết vấn đề này? –
Có, hãy làm điều đó. Bạn có thể làm cho nó một singleton và vẫn cung cấp một cách tĩnh để truy cập nó như: LogBase.GetLogger ("DataAccess"). Và sau đó bạn gần như trông như thế nào trong log4net, mà bạn có thể muốn xem. – chiccodoro